使用ASP.NET Web API支持PUT和DELETE的CORS

时间:2012-09-20 21:56:00

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

我正在使用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 个答案:

答案 0 :(得分:25)

此外,除了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请求)将无效。

答案 1 :(得分: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中启用CORS,您将面临cors错误。

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

答案 2 :(得分: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>

答案 3 :(得分:0)

尝试注释以下行:<remove name="OPTIONSVerbHandler" />标签中的<handlers>