Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JQuery在CORS飞行前和IIS重影响应时卡住_Jquery_Http_Asp.net Web Api_Cors - Fatal编程技术网

JQuery在CORS飞行前和IIS重影响应时卡住

JQuery在CORS飞行前和IIS重影响应时卡住,jquery,http,asp.net-web-api,cors,Jquery,Http,Asp.net Web Api,Cors,我卡住了。说真的…-已解决。继续阅读:) 场景:我正在尝试做正确的事情。我在REST服务(ASP.NET Web API)中添加了CORS功能,这依赖于ThinkStructure Identitymodel CORS DelegatingHandler。到目前为止还不错 为了实际测试它是否工作,我做了以下操作: 我设置了一个简单的HTML页面,并将其发布在与rest服务不同的主机上(xttp://otherhost/simplewebpage). 页面使用JQuery发出示例请求。代码见下文

我卡住了。说真的…-已解决。继续阅读:)

场景:我正在尝试做正确的事情。我在REST服务(ASP.NET Web API)中添加了CORS功能,这依赖于ThinkStructure Identitymodel CORS DelegatingHandler。到目前为止还不错

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

  • 我设置了一个简单的HTML页面,并将其发布在与rest服务不同的主机上(xttp://otherhost/simplewebpage). 页面使用JQuery发出示例请求。代码见下文
  • 接下来,我将rest服务设置为不使用iis express,而是在我的开发机器上运行它的完整实例(xttp://developmenthost/restservice)
  • 最后但并非最不重要的是,在我的开发机器上,我打开了xttp://otherhost/simplewebpage 并启动Ajax请求。执行错误回调时告诉我Chrome中存在“传输错误”(IE9)或“”(空字符串)。我确保没有代理相关的连接问题或类似的问题
  • 所以我出去看了看小提琴手的痕迹和IIS日志。 Fiddler说没有GET/rest/hello请求,而是一个OPTIONS/rest/hello请求——这是完全可以预料到的!然而,对选项请求的响应相当有趣

    整个响应标题如下所示:

    当然,这与预期的反应相去甚远有趣的是,请求甚至没有命中我的应用程序中的应用程序_BeginRequest()。因此我的应用程序不可能对该结果负责。我可以在我的IIS日志中看到请求,IIS添加了Powered-by-ASP.NET头。。所以它肯定会通过(右边的)IIS站点

    触发ajax请求的JQuery代码:

    生成的选项请求如下所示:

    。。。你已经看到了上面的反应

    知道谁确切地回答了我的选择要求吗?还是我的JQuery代码有缺陷? 如果我使用例如Postman(谷歌Chrome应用程序)或者我在Fiddler中伪造请求(这可能是因为他们不进行CORS协商-没有选项请求),REST服务就可以正常工作

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

    *更新#2:问题已解决??我挖得更深。IIS中注册了一个模块,负责对选项请求的“意外(?)响应。它的名称是“OPTIONSVerbHandler”(处理程序:ProtocolSupportModule)。如果禁用该模块,请求将传递到我的应用程序。创建了一个更有意义的响应,然后是实际的GET请求<太棒了

    一旦你知道问题出在哪里,当然你会发现大量的资源告诉你要确保你的web.config是这样的:-/

    
    您的答案如下:
    

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

    这个解决方案可能比您想要的要重一些,但对于跨浏览器支持,我发现用“自定义解决方案”尽可能地攻击IE是可以接受的。

    检查这个。这可能会对您有所帮助

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

    1。公共类预处理请求处理程序:DelegatingHandler
    {
    受保护的覆盖任务SendAsync(HttpRequestMessage请求,CancellationToken CancellationToken)
    {
    if(request.Headers.Contains(“Origin”)&&request.Method.Method.Equals(“OPTIONS”))
    {
    var response=newhttpresponsemessage{StatusCode=HttpStatusCode.OK};
    //定义并向变量添加值:源、头、方法(可以是全局的)
    添加(“访问控制允许源代码”、“*”);
    添加(“访问控制允许标题”、“内容类型”);
    添加(“访问控制允许方法”,“*”);
    var tsc=new TaskCompletionSource();
    tsc.设置结果(响应);
    返回tsc任务;
    }
    返回base.sendaync(请求、取消令牌);
    }
    }
    2.[EnableCors(来源:“*”,标题:“*”,方法:“*”,公开标题:“X-Custom-Header”)]
    
    尝试将crossDomain字段设置为true。它对我有效。您说“问题已解决?”它是否真的为您解决了?我也有同样的问题,并且尝试了所有这些解决方案,但仍然没有运气。。。。我的问题@lapsus,我面临着类似的问题,请让我知道你是否可以帮助我,我从未收到过使用IIS的预飞请求,最终使用了框架,而brrrrI正在应用这些修复,但根本没有帮助。任何HTTP选项请求都无法通过,IIS日志文件中甚至没有选项请求的日志。经过两个小时的挫折,当我完全绝望时,我决定在IIS中重新启动wcf服务web应用程序,它突然工作了!!据我所知,每当配置文件更改时,IIS都会重新启动应用程序池,但这次没有重新启动。没关系,我只是想让它工作,然后就完成了+1美元。希望这对某人有所帮助..问题是IIS正在拦截OPTIONS方法事务。该应用程序从未看到这种流量,因此对该应用程序进行任何更改都不会有帮助。要明确的是,这只是关于IE9支持的一个答案,只是在会议上提到的
    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
    
        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 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
    
    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
    
    <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>
    
    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")]