预检请求在IIS中不起作用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了预检请求在IIS中不起作用相关的知识,希望对你有一定的参考价值。
我有一个使用web api的Web客户端。这是我的要求:
let peticion = {
attr1: "0000000047",
attr2: "070101201"
};
$.ajax({
type: "POST",
url:"http://161.168.1.33:1210/api/Trabajador/ElTrabajadorYaHaSidoRequeridoEnEsteLocal",
data: JSON.stringify(peticion),
contentType: "application/json; charset=utf-8",
crossDomain: true,
dataType: "json",
success: function (data, status, jqXHR) {
},
error: function (jqXHR, status) {
}
}).then(function (respuesta) {
});
据我所知,API控制器中的Cors已启用,代码行启用了所有内容(*),但它仅适用于简单请求,而不适用于预检请求。
[EnableCors(origins: "*", headers: "*", methods: "*")]
所以我得到了接下来的两个错误:
- 选项http://161.168.1.33:1210/api/Trabajador/ElTrabajadorYaHaSidoRequeridoEnEsteLocal 404(未找到)
- http://161.168.1.33:1210/api/Trabajador/ElTrabajadorYaHaSidoRequeridoEnEsteLocal:对预检请求的响应未通过访问控制检查:否 请求中存在“Access-Control-Allow-Origin”标头 资源。因此不允许来源'http://localhost:51939' 访问。
我错过了什么吗?为什么web api不处理预检请求?
答案
您可能仍需要删除默认的IIS OPTIONSVerbHandler
,然后将OPTIONS
动词添加到适当的处理程序以允许请求到达您的api。
即你的web.config
文件需要按照以下方式编辑
<system.webServer>
<handlers>
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit"/>
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit"/>
<remove name="ExtensionlessUrlHandler-Integrated-4.0"/>
<remove name="OPTIONSVerbHandler"/>
<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%Microsoft.NETFrameworkv4.0.30319aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0"/>
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%Microsoft.NETFramework64v4.0.30319aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0"/>
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0"/>
</handlers>
</system.webServer>
请注意您使用的动词以及为您使用正确的aspnet_isapi.dll。
另一答案
我只是通过在web配置中设置来解决它
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Methods" value="*" />
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="*" />
</customHeaders>
并删除此行:
<!--<remove name="OPTIONSVerbHandler" />-->
无论如何,当我从网络配置中删除那些海关标题并在Api控制器中添加[EnableCors(origins: "*", headers: "*", methods: "*")]
时,我只收到一个错误:
无法加载http://192.168.1.33:1210/api/Trabajador/ElTrabajadorYaHaSidoRequeridoEnEsteLocal:对预检请求的响应未通过访问控制检查:请求的资源上没有“Access-Control-Allow-Origin”标头。因此,'http://localhost:51939'原产地不允许进入。
我仍然不明白从Api控制器或webconfig启用cors之间的区别
以上是关于预检请求在IIS中不起作用的主要内容,如果未能解决你的问题,请参考以下文章