【问题标题】:CORS support for PUT and DELETE with ASP.NET Web API使用 ASP.NET Web API 对 PUT 和 DELETE 的 CORS 支持
【发布时间】:2012-09-13 08:14:13
【问题描述】:

我正在使用 ASP.NET Web API 的最终版本来实现对 JavaScript 友好的 API。根据各种教程,我在 web.config 中启用了 CORS:

<system.webServer>
 <httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Headers" value="Content-Type" />
  </customHeaders>
 </httpProtocol>
</system.webServer>

使用上述方法,跨域 GET 和 POST 请求可以正常工作,但 PUT 和 DELETE 请求都失败。

在 Chrome 中:

Access-Control-Allow-Methods 不允许方法 PUT。

Access-Control-Allow-Methods 不允许方法 DELETE。

让 PUT 和 DELETE 动词跨域工作是否需要额外的东西?

【问题讨论】:

  • 你是如何在 webconfig 中启用 CORS 的?
  • 你也有一个全局 CORS 处理程序吗?还是您仅在 web.config 中修复了 CORS?
  • 我只在 web.config 级别实现了这个。

标签: asp.net cross-domain asp.net-web-api cors


【解决方案1】:

看起来像添加另一个自定义标题将其整理出来:

<system.webServer>
 <httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Headers" value="Content-Type" />
    <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
  </customHeaders>
 </httpProtocol>
</system.webServer>

【讨论】:

  • 这对我不起作用。仅适用于 GET 和 POST。
【解决方案2】:

此外,除了 Nathan 回答之外,请确保您禁用了 WebDAV IIS 模块并在 web.config 中设置 runAllManagedModulesForAllRequests="true" 设置:

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

没有这个,preflight CORS requests(用于 PUT、DELETE 方法和发送额外的 OPTIONS 请求)将不起作用。

【讨论】:

  • 啊,谢谢!如果没有 web.config 中的这些代码行,我的 CORS 处理程序就无法工作。
  • WebDAV 处理程序在做什么,为什么需要删除它?
  • @JimAho:很好的解释在这里:asp.net/web-api/overview/testing-and-debugging/…
  • 天啊!!!我为此花了将近7天!幸运的是我明白了。类似的问题对我来说。问题仅适用于 PUT + DELETE 。终于解决了,谢谢。
【解决方案3】:

在 WEBAPI2.2 中克服 CORS 问题的非常简单的解决方案。

在您的 WebApi 配置文件中添加以下内容。

var cors = new EnableCorsAttribute("*", "*", "*");
Config.EnableCors(cors);

在添加之前,请确保删除 Web.config 文件中的自定义标头。

    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Credentials" value="true" />
    <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept, X-Token" />
    <add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE,OPTIONS" />

如果您在 WebApiconfig 中同时启用了 customheader 以及 CORS,您将面临 cors 错误。

添加在 WebApi 配置中启用的 cors 将解决问题。

【讨论】:

  • 这是一个很好的当前解决方案和一个很好的解释。正如您所提到的,请确保这两种配置都不存在(WebApiConfig.cs Web.config),否则 CORS 配置将发生冲突并导致 The 'Access-Control-Allow-Origin' header contains multiple values 'http://localhost:1234, *', but only one is allowed. 错误。
  • 另外,使用EnableCorsAttribute类需要以下NuGet包:nuget.org/packages/Microsoft.AspNet.WebApi.Cors
【解决方案4】:

部署应用时请在 web.config 中使用,请勿在本地 web.config 中使用

    <system.webServer>
  <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Content-Type" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
      </customHeaders>
    </httpProtocol>
 <ModSecurity enabled="false" configFile="C:\inetpub\wwwroot\owasp_crs\modsecurity.conf" />
    <validation validateIntegratedModeConfiguration="false" />
    <handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>

  </system.webServer>

【讨论】:

    【解决方案5】:

    尝试在&lt;handlers&gt;标签中注释&lt;remove name="OPTIONSVerbHandler" /&gt;

    【讨论】:

      猜你喜欢
      • 2018-03-21
      • 2012-07-29
      • 2012-06-28
      • 2012-06-10
      • 2017-01-29
      • 2020-06-02
      • 2016-10-07
      • 2017-04-24
      相关资源
      最近更新 更多