【问题标题】:CORS operation being canceledCORS 操作被取消
【发布时间】:2014-09-02 16:59:26
【问题描述】:

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

我已经尝试过简单示例项目的步骤(注意: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 点相同的操作。

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 - 为什么?

【问题讨论】:

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


    【解决方案1】:

    对于某些 CORS 请求,浏览器/jQuery/ajax 在发送对资源的实际请求之前会发送一个额外的请求,称为“预检请求”,因为跨站点请求可能会对用户数据产生影响。

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

    • 请求方法为GETHEADPOST
    • 应用程序没有设置除 Accept、Accept-Language、Content-Language、Content-Type 或 Last-Event-ID 之外的任何请求标头,
    • Content-Type 标头(如果已设置)是以下之一:
      • application/x-www-form-urlencoded
      • 多部分/表单数据
      • 文本/纯文本

    以上内容仅根据this link(在“预检请求”下)中的信息稍作改编。

    与简单请求不同,“预检”请求首先通过OPTIONS方法向其他域上的资源发送一个HTTP请求,以确定实际请求是否可以安全发送。

    我的猜测是你的控制器中没有处理OPTIONS 的操作方法,因此你得到一个405,即错误与“隐秘”OPTIONS 请求有关,而不是你的@ 987654330@。在最简单的形式中,您可以在控制器中实现这样的操作方法。

    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 的人来说绝对是必读的。

    【讨论】:

    • 感谢您的长时间回复 :) 我浏览了这篇文章,试图从那些该死的标题中找到我遗漏的内容。使用 webDav 的技巧并没有解决我的问题。
    • @jstadnicki:不客气。我只是希望它能以某种方式帮助你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多