jQuery卡在CORS预检和IIS幻影响应中

2020/12/29 17:51 · jquery ·  · 0评论

我被卡住了。 认真... -解决。继续阅读:)

场景:我正在尝试做正确的事情。我依靠Thinktecture Identitymodel CORS DelegatingHandler将CORS功能添加到我的REST服务(ASP.NET Web-API)中。到现在为止还挺好。

为了实际测试它是否有效,我做了以下工作:

  1. 我设置了一个简单的HTML页面,并将其发布在与其余服务(xttp:// otherhost / simplewebpage不同的主机上该页面使用JQuery发出示例请求。代码见下文。
  2. 接下来,我将我的rest服务设置为不使用iis express,而是使用它在我的开发计算机(xttp:// developmenthost / restservice上运行的完整实例
  3. 最后但并非最不重要的一点是,在开发机器上,我打开xttp:// otherhost / simplewebpage并触发Ajax请求。错误回调被执行,告诉我Chrome中存在“传输错误”(IE9)或“”(空字符串)。我确保没有与代理相关的连接问题或类似问题。

因此,我继续浏览了Fiddler跟踪和IIS日志。Fiddler表示没有GET / rest / hello请求,而是OPTIONS / rest / hello请求-完全可以预期!但是,对OPTIONS请求的响应非常有趣!

整个响应标头如下所示:

HTTP/1.1 200 OK
Allow: OPTIONS, TRACE, GET, HEAD, POST
Server: Microsoft-IIS/7.5
Public: OPTIONS, TRACE, GET, HEAD, POST
Date: Fri, 15 Feb 2013 14:09:27 GMT
Content-Length: 0

当然,这远远没有达到预期的响应。有趣的是,该请求甚至没有在我的应用程序中命中Application_BeginRequest()。因此,我的应用程序无法对结果负责。我可以在IIS日志中看到该请求,并且IIS添加了Powered-by-ASP.NET标头。因此,它肯定通过了(正确的)IIS站点。

触发ajax请求的JQuery代码:

    function Run()
    {
        $.ajax({
            type: 'GET',
            url: url,
            dataType: "json",
            beforeSend: function(jqXhr) {
                jqXhr.setRequestHeader("Authorization", "Basic " + getBasicHttpEncodedString(userName, password));
                jqXhr.setRequestHeader("Api-Key", "123");
            },
            success: successCallback,
            error: errorCallback,
            timeout: 180*1000
        });
    }

产生的OPTIONS请求如下所示:

OPTIONS http://services.dev13/Rest/Hello HTTP/1.1
Host: developmenthost
Connection: keep-alive
Access-Control-Request-Method: GET
Origin: http://otherhost/simplewebpage
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17
Access-Control-Request-Headers: accept, origin, api-key, authorization
Accept: */*
DNT: 1
Referer: http://otherhost/simplewebpage
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

...并且您已经看到了对以上内容的回应。

知道谁能准确回答我的OPTIONS请求吗?还是我的JQuery代码有缺陷?如果我使用Postman(Google Chrome App)或在Fiddler中伪造请求(这可能是因为它们不进行CORS协商-没有OPTIONS请求),那么REST服务就可以正常工作。

更新#1:今天早些时候,我读到某处文章说禁用WebDAV是强制性的,因为它会干扰OPTIONS请求。我的IIS角色服务视图告诉我未安装WebDAV发布

*更新#2:*问题已解决??我挖得更深了。在IIS中注册了一个模块,该模块负责对OPTIONS请求的“不必要(?)”响应。它的名称是“ OPTIONSVerbHandler”(处理程序:ProtocolSupportModule)。如果我禁用该模块,则请求将传递到我的应用程序。将创建一个更有意义的响应,然后再执行实际的GET请求! 好极了!

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Server: Microsoft-IIS/7.5
Access-Control-Allow-Origin: http://otherhost/simplewebpage
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: accept,origin,api-key,authorization
X-AspNet-Version: 4.0.30319
Date: Fri, 15 Feb 2013 15:09:25 GMT
Content-Length: 0

一旦知道了问题所在,当然您会发现有很多资源告诉您确保web.config看起来像这样:-/

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="false">
      <remove name="WebDAVModule" />
    </modules>
    <handlers>
      <remove name="OPTIONSVerbHandler" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <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>

但是,它在IE9中仍然不起作用(“错误:没有传输”)。万一有人沿着我的路走->这是IE9:https//stackoverflow.com/a/10232313/1407618

创建PreflightRequestsHandler类,在其中允许请求标头(1),并在类(2)之前启用cors。

1. public class PreflightRequestsHandler : DelegatingHandler
    {
        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            if (request.Headers.Contains("Origin") && request.Method.Method.Equals("OPTIONS"))
            {
                var response = new HttpResponseMessage { StatusCode = HttpStatusCode.OK };
                // Define and add values to variables: origins, headers, methods (can be global)               
                response.Headers.Add("Access-Control-Allow-Origin", "*");
                response.Headers.Add("Access-Control-Allow-Headers", "content-type");
                response.Headers.Add("Access-Control-Allow-Methods", "*");
                var tsc = new TaskCompletionSource<HttpResponseMessage>();
                tsc.SetResult(response);
                return tsc.Task;
            }
            return base.SendAsync(request, cancellationToken);
        }

    }

2. [EnableCors(origins: "*", headers: "*", methods: "*", exposedHeaders: "X-Custom-Header")]

您的答案在这里:https :
//gist.github.com/mathieucarbou/1114981

基本上,IE对于cors有一些非常具体的警告和陷阱。我开始自己写过一次书,但是后来我找到了mathieucarbou的解决方案,并决定他会更好。

这可能比您想要的解决方案要重一些,但是对于跨浏览器支持,我发现可以通过“自定义解决方案”来达到最大的难度。

检查此set-access-control-allow-origin-in-web-api,这可能会对您有所帮助。

本文地址:http://jquery.askforanswer.com/jquerykazaicorsyujianheiishuanyingxiangyingzhong.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!