CORS操作被取消

时间:2014-07-12 00:20:18

标签: asp.net ajax asp.net-web-api cors

在过去的两天里,我一直在努力使用webapi(asp.net)和ajax查询。我可能已经在互联网上阅读了所有可能的解决方案,但它仍然无法在我的机器上运行。

我已尝试使用简单示例项目(NB:localhost替换为LH)的步骤:

  1. [不工作]

    public static void Register(HttpConfiguration config)
    {
        config.EnableCors(new EnableCorsAttribute("*", "*", "*"));
        // omitted
    }
    
  2. [不工作]

    [EnableCors("*", "*", "GET,POST,PUT,OPTIONS")]
    public class ValuesController : ApiController
    { /* code goes here */}
    
  3. [不工作]

    [EnableCors("*","*","PUT")]
    public void Put(int id, string value)
    {
        values[id] = value;
    }
    
  4. [不工作]
    我也试过添加这些:

    <httpProtocol>
     <customHeaders>
      <add name="Access-Control-Allow-Origin" value="*" />
      <add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE,OPTIONS" />
      <add name="Access-Control-Allow-Headers" value="Content-Type" />
     </customHeaders>
    </httpProtocol>
    
  5. [不工作]
    最后,我使用IIS管理与第4点相同。

  6. FF F12工具网络面板的结果:

    GET  LH:8821/api/values 200 OK                 229ms    ["Item1", "Item2", "Item3"]
    PUT  LH:8821/api/values 405 Method Not Allowed 114ms    "NetworkError: 405 Method Not Allowed - LH:8821/api/values"
    POST LH:8821/api/values 405 Method Not Allowed 123ms    "NetworkError: 405 Method Not Allowed - LH:8821/api/values"
    

    我做错了什么,还是我错过了其他一些设置?

    我取得的最佳成绩是GETPOST工作,但是当谈到PUT时,我总是得到405 - 为什么?

1 个答案:

答案 0 :(得分:1)

对于某些CORS请求,浏览器/ jQuery / ajax在发送对资源的实际请求之前发送另一个请求,称为&#34;预检请求&#34;,因为跨站请求可能会对用户数据。

如果满足以下条件,浏览器/ jQuery / ajax可以跳过预检请求:

  • 请求方法为GETHEADPOST
  • 除了接受,接受语言,内容语言,内容类型或最后事件ID,
  • 之外,应用程序不会设置任何请求标头
  • Content-Type标头(如果已设置)是以下之一:
    • 应用程序/ x-WWW窗体-urlencoded
    • 的multipart / form-data的
    • 文本/纯

上述内容仅略微改编自this link中的信息(&#34; Preflight Requests&#34;)。

与简单的请求不同,&#34; preflighted&#34;请求首先通过OPTIONS方法向另一个域上的资源发送HTTP请求,以确定实际请求是否可以安全发送。

我的猜测是你没有一个处理控制器中OPTIONS的动作方法,因此你得到一个405,即错误与&#34;隐身& #34; OPTIONS请求,而非PUT。在最简单的形式中,您可以在控制器中实现这样的动作方法。

public HttpResponseMessage Options()
{
    var response = new HttpResponseMessage();
    response.StatusCode = HttpStatusCode.OK;
    return response;
}

此外,如果您禁用WebDAV IIS模块并在web.config中设置runAllManagedModulesForAllRequests="true"设置,它可能会有所帮助:

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true">
    <remove name="WebDAVModule"/>
  </modules>
  <handlers>
    <remove name="WebDAV" />
  </handlers>
</system.webServer>

我确定你已经阅读了很多关于这方面的文章,所以你可能已经尝试了我已经说过的部分或全部,但是,由于你的问题中没有说明,我认为它在这里值得一提。

顺便说一句,如果您还没有读过这篇文章,this article by Brock Allen对于任何在Web API 2中乱搞CORS的人来说都是绝对必读的。