我有一个使用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 CONTROLLER中启用了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不处理预检请求?
答案 0 :(得分:1)
您可能仍然需要删除默认的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.NET\Framework\v4.0.30319\aspnet_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.NET\Framework64\v4.0.30319\aspnet_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。
答案 1 :(得分:0)
我刚刚通过在webconfig中进行设置解决了
<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" />-->
无论如何,当我从webconfig中删除这些海关标头并在Api Controller中添加[EnableCors(origins: "*", headers: "*", methods: "*")]
时,我只会遇到一个错误:
无法加载http://192.168.1.33:1210/api/Trabajador/ElTrabajadorYaHaSidoRequeridoEnEsteLocal:对预检请求的响应未通过访问控制检查:所请求的资源上没有'Access-Control-Allow-Origin'标头。因此,不允许访问来源“ http://localhost:51939”。
我仍然不明白从Api控制器或从webconfig启用cors有什么区别
答案 2 :(得分:0)
我正在将PHP与IIS一起使用,在我的情况下,PHP自定义框架正在处理OPTION请求,但该请求未到达PHP脚本。
这是web.config的某些部分,它对此进行了更改:
<configuration>
<system.webServer>
<httpProtocol>
<customHeaders>
<remove name="X-Powered-By" />
<!--add name="Access-Control-Allow-Origin" value="*" /-->
<add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE,OPTIONS" />
<add name="Access-Control-Allow-Headers" value="Content-Type,app-code,auth-token,myapp-handle-errors-generically" />
</customHeaders>
因此请注释Access-Control-Allow-Origin,并允许在PHP脚本上执行选项:
<handlers>
<remove name="PHP_via_FastCGI" />
<add name="PHP_via_FastCGI" path="*.php" verb="GET,HEAD,POST,PUT,DELETE,OPTIONS" modules="FastCgiModule" scriptProcessor="C:\Program Files\PHP\v7.0\php-cgi.exe" resourceType="Either" requireAccess="Script" />
</handlers>
</system.webServer>