我发送一个发送请求到一个RESTFUL WCF服务应用程序。我可以通过Fiddler成功发送POST请求。
但是,当我通过jQuery Ajax方法执行此操作时,该函数将以下内容返回给Chrome开发者控制台:
OPTIONS http://www.example.com/testservice/service1.svc/GetData 405 (Method Not Allowed) jquery.min.js:6
但是之后的第二个日志之后:
Object {d: "You entered 10"} testpost.html:16
这告诉我的是,jQuery正在发送OPTIONS请求,该请求失败,然后发送返回预期数据的POST请求。
我的jQuery代码:
$.ajax() { type: "POST",//GET or POST or PUT or DELETE verb url: "http://www.example.com/testservice/service1.svc/GetData",// Location of the service data: '{"value":"10"}',//Data sent to server contentType:"application/json",dataType: "json",//Expected data format from server processdata: false,success: function (msg) {//On Successfull service call console.log(msg); },error: function (xhr) { console.log(xhr.responseText); } // When Service call fails });
我使用的是jQuery 2.0.2版本。
任何帮助,为什么这个错误发生将是一个很大的帮助。
解决方法
你的代码实际上是尝试制作一个
Cross-domain (CORS)请求,而不是普通的POST。
也就是说:现代浏览器只允许Ajax调用与HTML页面相同的域中的服务。
示例:http://www.example.com/myPage.html中的网页只能直接请求http://www.example.com中的服务,例如http://www.example.com/testservice/etc 。如果该服务在其他域中,则浏览器将不会进行直接呼叫(如您所期望的)。相反,它将尝试制作CORS请求。
要简单地说,要执行CORS请求,您的浏览器:
>首先将OPTION请求发送到目标URL
>然后只有当服务器对该OPTION的响应包含adequate headers (Access-Control-Allow-Origin
is one of them)以允许CORS请求时,浏览将执行调用(几乎完全一样,如果HTML页面在同一个域)。
>如果预期的标题不来,浏览器就会放弃(就像你这样做)。
如何解决?最简单的方法是在服务器上启用CORS(启用必要的头文件)。
如果您没有对其进行服务器端访问,则可以从其他地方镜像Web服务,然后在那里启用CORS。