【问题标题】:Preflighted request is not working in IIS预检请求在 IIS 中不起作用
【发布时间】:2019-10-25 22:32:33
【问题描述】:

我有一个使用 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 动词没有任何禁止的内容。

我错过了什么吗?为什么 web api 不处理预检请求?

【问题讨论】:

标签: asp.net-mvc iis cors


【解决方案1】:

我刚刚通过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 控制器中添加 [EnableCors(origins: "*", headers: "*", methods: "*")] 时,我只会收到一个错误:

无法加载http://192.168.1.33:1210/api/Trabajador/ElTrabajadorYaHaSidoRequeridoEnEsteLocal:对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。 Origin 'http://localhost:51939' 因此不允许访问。

我仍然不明白从 Api 控制器或从 webconfig 启用 cors 之间有什么区别

【讨论】:

    【解决方案2】:

    您可能仍需要删除默认 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。

    【讨论】:

    • 如果我从 webconfig 启用 CORS,它可以工作,但如果我从 WebAPi 控制器启用 CORS,它就不起作用。我不知道为什么
    • 我必须添加这一行 &lt;remove name="WebDav" /&gt; 然后它才能工作
    【解决方案3】:

    我在 IIS 中使用 PHP,在我的例子中,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 脚本上执行 OPTIONS:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-15
      • 2021-07-07
      • 2015-04-11
      • 1970-01-01
      • 2012-06-08
      • 2017-07-04
      • 2013-10-02
      • 1970-01-01
      相关资源
      最近更新 更多