预检请求在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: "*")]

所以我得到了接下来的两个错误:

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

我错过了什么吗?为什么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中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用 NancyFX 获取在 CORS 中不起作用的请求

cgi 页面在本地 IIS 中不起作用

DELETE 动词在 iis 10 中不起作用

java代码在片段活动中不起作用

Javascript代码片段在drupal中不起作用

onRequestPermissionsResult 在片段中不起作用