37

我正在使用 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 动词跨域工作是否需要额外的东西?

4

5 回答 5

53

看起来添加另一个自定义标题对其进行了排序:

<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>
于 2012-09-20T22:11:33.143 回答
32

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

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

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

于 2012-12-21T00:06:10.653 回答
9

在 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 将解决该问题。

于 2015-05-22T08:11:04.287 回答
0

请在部署应用程序时在 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>
于 2016-04-15T08:48:48.750 回答
0

尝试评论该行:<remove name="OPTIONSVerbHandler" />in <handlers>tag

于 2019-02-19T13:28:38.550 回答