预检请求在IIS中不起作用

时间:2018-10-16 01:13:43

标签: asp.net-mvc iis cors

我有一个使用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: "*")]

所以我收到以下两个错误:

在IIS中,http动词没有任何禁止的内容。 enter image description here

我想念什么吗?为什么Web api不处理预检请求?

3 个答案:

答案 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>