jQuery .ajax()POST请求在RESTful WCF上抛出405(不允许方法)

问题描述 投票:35回答:4

我正在向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版。

关于为什么会发生此错误的任何帮助都将提供很大的帮助。

jquery web-services rest post wcf-rest
4个回答
62
投票

您的代码实际上是在尝试发出Cross-domain (CORS)请求,而不是普通的POST

即:现代浏览器只允许Ajax调用与HTML页面相同的same domain中的服务。

示例: http://www.example.com/myPage.html中的页面只能直接请求http://www.example.com中的服务,例如http://www.example.com/testservice/etc。如果服务在其他域中,则浏览器将不会直接呼叫(如您期望的那样)。相反,它将尝试发出CORS请求。

简而言之,要执行CORS请求,请使用浏览器:

  • 将首先发送OPTION请求到目标URL
  • 然后仅当服务器对OPTION的响应包含允许CORS请求的adequate headers (Access-Control-Allow-Origin is one of them)时,浏览器将执行该调用(几乎完全相同,如果HTML页面位于同一页面上域)。
    • 如果没有期望的标题,浏览器只会放弃(就像对您一样)。

如何解决?]最简单的方法是在服务器上启用CORS(启用必要的标头)。

如果您没有服务器端的访问权限,则可以从其他地方镜像Web服务,然后在该处启用CORS。


5
投票

您必须在global.aspx


3
投票

您也可以在过滤器中创建所需的标题。


0
投票

由于相同的错误代码,我有完全不同的原因,我在这里分享以提供帮助

© www.soinside.com 2019 - 2024. All rights reserved.