JQuery Ajax POST 到 Web API 返回 405 Method Not Allowed

Posted

技术标签:

【中文标题】JQuery Ajax POST 到 Web API 返回 405 Method Not Allowed【英文标题】:JQuery Ajax POST to Web API returning 405 Method Not Allowed 【发布时间】:2015-07-01 01:32:55 【问题描述】:

所以我有一个这样的 jquery ajax 请求:

    function createLokiAccount(someurl) 
    var d = "Jurisdiction":17

        $.ajax(
                type: "POST",
                url:"http://myserver:111/Api/V1/Customers/CreateCustomer/",
                data: JSON.stringify(d),
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function(data)alert(data);,
                failure: function(errMsg) 
                    alert(errMsg);
                
            );
    

这击中了我的 web api,它基本上是:

    [HttpPost]
    public CreateCustomer.Response CreateCustomer(CreateCustomer.Request request)
    
        HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Origin", "*");
    ...

当我在 Chrome 中调用它时给了我:

OPTIONS http://myserver:111/Api/V1/Customers/CreateCustomer/ 405 (Method Not Allowed) 
No 'Access-Control-Allow-Origin' header is present on the requested resource.      

当我从 Fiddler 发出 POST 请求时,它应该在响应标头中包含“Access-Control-Allow-Origin:*”,这表明 API 配置正确,但(来自 Fiddler)jquery 请求看起来像:

选项http://myserver:111/Api/V1/Customers/CreateCustomer/ HTTP/1.1 主机:我的服务器:111 连接:保持活动 访问控制请求方法:POST 来源:http://localhost:6500 用户代理:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/34.0.1847.116 Safari/537.36 Access-Control-Request-Headers:接受,内容类型 接受:/ 推荐人:http://localhost:6500/Home/Replication?interval=1 接受编码:gzip、deflate、sdch 接受语言:en-US,en;q=0.8,en-GB;q=0.6,it-IT;q=0.4,it;q=0.2

那么为什么我的 POST 请求变成了 OPTIONS 请求?

【问题讨论】:

您是否从localhost:6500 向myserver:111 上运行的API 发出ajax 请求? 是的,我是。 GET 请求似乎可以正常工作,只是 POST 没有达到我的预期。 【参考方案1】:

首先,您只添加了一个标题,但您至少需要其中三个:

"Access-Control-Allow-Origin", "*"

"Access-Control-Allow-Methods", "GET, POST, PUT, DELETE"

"Access-Control-Allow-Headers", "Content-Type, Accept"

其次,如果您只需要 CORS 用于某个控制器中的一种方法,那么您添加标头的方式是可以的。但一般来说是不对的。

带有 Web API 2 的 ASP.NET 5 提供 CORS library。

但是,如果您使用的是 Web API,我可以提供解决方案(不是真正正确,但可以工作)。只需将(在 Global.asax 中)添加到每个请求所需的标头中

protected void Application_BeginRequest(object sender, EventArgs e)

    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
    if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
    
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
        HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
        HttpContext.Current.Response.End();
    


【讨论】:

以上是关于JQuery Ajax POST 到 Web API 返回 405 Method Not Allowed的主要内容,如果未能解决你的问题,请参考以下文章

跨域 ajax POST 到 web-api 总是返回空响应

jQuery AJAX POST 到 ASMX Web 服务导致“无法将 System.String 类型的对象转换为 System.Collections.Generic.IDictionary”

asmx 接受 ajax post,jQuery ajax request from asmx web service

对 ASP.NET Web 服务的 jQuery ajax POST 调用随机失败

如何使用 jQuery AJAX 发布到 RESTful Web 服务?

Jquery AJAX post提交json示例