我正在使用 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 请求都失败。
在铬中:
方法PUT是访问控制允许方法不允许的。
方法删除不允许由访问控制允许方法。
让 PUT 和 DELETE 动词跨域工作是否需要其他内容?
看起来添加另一个自定义标头已排序:
<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>
另外,除了 Nathan 回答之外,请确保您禁用了 WebDAV IIS 模块并在 web.config 中设置runAllManagedModulesForAllRequests="true"
设置:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule"/>
</modules>
<handlers>
<remove name="WebDAV" />
</handlers>
</system.webServer>
否则,预检 CORS 请求(用于 PUT、DELETE 方法和发送其他 OPTIONS 请求)将不起作用。
克服 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 将解决此问题。
请在部署应用程序时在 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:inetpubwwwrootowasp_crsmodsecurity.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>
尝试注释该行:<remove name="OPTIONSVerbHandler" />
in <handlers>