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

Nat*_*lor 35 asp.net cross-domain cors asp.net-web-api

我正在使用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>
Run Code Online (Sandbox Code Playgroud)

有了上述,跨域GET和POST请求工作正常,但PUT和DELETE请求都失败.

在Chrome中:

Access-Control-Allow-Methods不允许使用方法PUT.

Access-Control-Allow-Methods不允许使用DELETE方法.

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

Nat*_*lor 48

它看起来像添加另一个自定义标头排序:

<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>
Run Code Online (Sandbox Code Playgroud)

  • 这对我不起作用。仅适用于 GET 和 POST。 (2认同)

why*_*eee 25

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

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true">
    <remove name="WebDAVModule"/>
  </modules>
  <handlers>
    <remove name="WebDAV" />
  </handlers>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)

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

  • 什么是`WebDAV`处理程序正在做什么,为什么需要删除它? (3认同)

小智 9

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

在WebApi配置文件中添加以下内容.

var cors = new EnableCorsAttribute("*", "*", "*");
Config.EnableCors(cors);
Run Code Online (Sandbox Code Playgroud)

在添加之前,请确保删除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" />
Run Code Online (Sandbox Code Playgroud)

如果您同时拥有自定义标题以及在WebApiconfig中启用CORS,您将面临cors错误.

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

  • 另外,需要以下NuGet包来使用`EnableCorsAttribute`类:https://www.nuget.org/packages/Microsoft.AspNet.WebApi.Cors (3认同)
  • 这是一个很好的当前解决方案和一个很好的解释.正如您所提到的,确保两个配置都不存在(WebApiConfig.cs _and_ Web.config)或CORS配置会发生冲突并导致`'Access-Control-Allow-Origin'标头包含多个值'http: // localhost:1234,*',但只允许一个.错误. (2认同)