【问题标题】:CORS with WebAPI for XmlHttpRequest用于 XmlHttpRequest 的带有 WebAPI 的 CORS
【发布时间】:2012-09-25 18:39:18
【问题描述】:

只是想知道在 ASP.NET WebAPI 中处理 CORS(跨源资源共享)的最佳优雅方式(当前可用)是什么,以便我可以在多个域上使用 XmlHttpRequest?我如何将其集成到每种类型的请求(GET、POST 等)的标头中也可以使用 OPTIONS?

谢谢!

【问题讨论】:

  • 跨域资源共享

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


【解决方案1】:

这取决于您想要控制 CORS 的细粒度。例如,如果您想允许任何域,您可以通过在 IIS 中配置它们来将静态 CORS 标头添加到所有响应中。我选择了这种方法和wrote about it here

【讨论】:

    【解决方案2】:

    Carlos Figueira 有一系列关于 CORS 和 ASP.NET Web API 的精彩博文:

    我个人是 Take 2 方法的忠实拥护者,因为 EnableCors 属性可以轻松扩展以让您控制允许的来源。

    【讨论】:

    • 有趣.. 但是我想我找到了更好的东西,可以满足我的需求,并且更多地看我的答案。
    【解决方案3】:

    Tpeczek 有一个很好的发现,但是在进行自己的研究时,我发现了一些类似且非常优雅的处理 CORS 的方法,它使您能够在 App_Start 文件夹中的配置文件中配置 CORS。它全部使用一个名为 Thinkecture 的开源库处理。在此处查看详细信息:

    http://brockallen.com/2012/06/28/cors-support-in-webapi-mvc-and-iis-with-thinktecture-identitymodel/

    它有很多优点。您可以配置来源、方法(GET、POST 等)、对特定控制器和操作的访问,它还可以让您的控制器免受任何属性的影响。

    支持 WebAPI、IIS 和 ASP.NET MVC!

    【讨论】:

      【解决方案4】:

      现在在 web api 的 nightly 中支持 CORS

      http://blogs.msdn.com/b/yaohuang1/archive/2013/04/05/try-out-asp.net-web-api-cors-support-using-the-nightly-builds.aspx

      使用nuget 来:

      • 卸载 Microsoft.AspNet.Mvc.FixedDisplayModes 包。
      • 从 nightly 版本中安装 Microsoft.AspNet.WebApi.Cors 包

      然后修复 web.config 中的绑定 然后启用 CORS

      config.EnableCors(new EnableCorsAttribute()) 
      

      在此 wiki https://aspnetwebstack.codeplex.com/wikipage?title=CORS%20support%20for%20ASP.NET%20Web%20API&referringTitle=Specs了解更多信息

      2013 年 4 月 19 日编辑 Scott Guthrie 曾在博客中介绍过它:http://weblogs.asp.net/scottgu/archive/2013/04/19/asp-net-web-api-cors-support-and-attribute-based-routing-improvements.aspx

      【讨论】:

      【解决方案5】:

      在 web.cofig 文件中添加以下内容(在 system.webserver 元素内)。

      <httpProtocol>
            <customHeaders>
              <add name="Access-Control-Allow-Headers" value="accept, maxdataserviceversion, origin, x-requested-with, dataserviceversion" />
              <add name="Access-Control-Allow-Origin" value="*" />
              <add name="Access-Control-Max-Age" value="1728000" />
            </customHeaders>
          </httpProtocol>
      

      并在 global.aspx.cs 文件中添加以下代码

          protected void Application_BeginRequest(object sender, EventArgs e)
          {
              if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
              {
                  Response.StatusCode = 200;
                  Response.End();
              }
          }
      

      【讨论】:

      • 以上解决方案对我有用。但是“OPTIONS”请求在第一时间发送到服务器。
      猜你喜欢
      • 2013-01-21
      • 2014-10-07
      • 2012-08-22
      • 2013-03-04
      • 2014-11-30
      • 2012-08-29
      • 2016-10-26
      • 2013-07-06
      • 2012-11-04
      相关资源
      最近更新 更多