用于 XmlHttpRequest 的带有 WebAPI 的 CORS

Posted

技术标签:

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

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

谢谢!

【问题讨论】:

跨域资源共享 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

Implementing CORS support in ASP.NET Web APIs Implementing CORS support in ASP.NET Web APIs – Take 2 CORS support in ASP.NET Web API – RC version

我个人是 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

【讨论】:

web api 文档中添加了一个新教程。他们已将 nigtly cors 更改集成到主要的 nuget 存储库中。 asp.net/web-api/overview/security/…【参考方案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”请求在第一时间发送到服务器。

以上是关于用于 XmlHttpRequest 的带有 WebAPI 的 CORS的主要内容,如果未能解决你的问题,请参考以下文章

XMLHttpRequest对象

XMLHttpRequest对象

带有 XMLHttpRequest 的 CORS 不起作用

AJAX核心--XMLHttpRequest五步法

带有 Blob URL 的 404 的 XMLHttpRequest 状态

----XMLHttpRequestAPI简单介绍----