我正在向 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
请求 - 然后仅当服务器对该
OPTION
的响应包含 adequate headers (Access-Control-Allow-Origin
is one of them)为了允许 CORS 请求,浏览器将执行调用(几乎与 HTML 页面位于同一域时的方式完全相同)。- 如果预期的 header 没有出现,浏览器就会放弃(就像它对您所做的那样)。
如何解决?最简单的方法是在服务器上启用 CORS(启用必要的 header )。
如果您没有服务器端访问权限,您可以从其他地方镜像 Web 服务,然后在那里启用 CORS。
关于jQuery .ajax() POST 请求在 RESTful WCF 上抛出 405(方法不允许),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17333013/