IE XdomainRequest CORS 问题

Posted

技术标签:

【中文标题】IE XdomainRequest CORS 问题【英文标题】:IE XdomainRequest CORS issue 【发布时间】:2013-09-08 14:30:12 【问题描述】:

我在使用 IE 时遇到问题(仅 IE8+,Chrome 工作正常),当我尝试将信息发布到我网站上的另一个页面时,我收到一条错误消息,提示“在 Access-Control 中找不到 Origin http://localhost:7230 -Allow-Origin 标头”。我知道这在某种程度上与 CORS 有关,但我不会离开我的领域。

发送请求的页面是:http://localhost:7230/TestPage.aspx

我试图发布到http://localhost:7230/ActionHandler.aspx的页面

要发布到页面的代码:

function RequestData()
   
      //If we have no data don't request anything, just reset the timer
      if (dataStore.topReadings.length == 0 && dataStore.specifiedRanges.length == 0 && dataStore.entireRanges.length == 0 && dataStore.periodRanges.length == 0)
      
         setInterval(RequestData, options.interval);
      

      var params = "?Action=GET_DATA";
      var body = GetRequestXML();

      var xmlhttp;

      if (window.XDomainRequest) // code for IE8 and IE9
      
         xmlhttp = new XDomainRequest();
         if (xmlhttp)
         
            xmlhttp.onerror = function ()
            
               alert("[Data Config]Failed to send request for configuration!\n" + xmlhttp.responseText);
            ;
            xmlhttp.ontimeout = function ()
            
               alert('xdr ontimeout');
            ;
            xmlhttp.onprogress = function ()
            
            ;
            xmlhttp.onload = function ()
            
               if (xmlhttp.responseText)
               
                  HandleResponseData($($.parseXML(xmlhttp.responseText)));
               
            ;

          else
         
            alert('failed to create xdr');
         
      
      else
      
         if (window.XMLHttpRequest) // code for IE7, Firefox, Chrome, Opera, Safari
         
            try
            
               xmlhttp = new XMLHttpRequest();
            
            catch (e)
            
               alert("[Data Request]Failed to create XMLHTTPRequest!\n" + e.message);
            
         
         else       // code for IE6, IE5
         
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
         

         xmlhttp.onreadystatechange = function ()
         
            if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
            
               //alert("Handled!");
               HandleResponseData($($.parseXML(xmlhttp.responseText)));
               that.trigger("dataReceived");
            
         
      

      try
      
         xmlhttp.timeout = options.timeout;
         xmlhttp.open("POST", "http://localhost:7230/ActionHandler.aspx" + params, true);
      
      catch (e)
      
         alert("[Data Request]Failed to open XMLHTTPRequest!\n" + e.message);
      

      setTimeout(function ()  xmlhttp.send(body); , 0);
   

这是一个在 Visual Studio 中运行的 ASP.NET 网站。我已经按照here 的步骤操作,并将相关行添加到我的 web.config 文件中。任何有关如何将我的请求传递到 ActionHandler 页面的帮助将不胜感激。

【问题讨论】:

如果您使用 Fiddler 或 F12 的“网络”选项卡查看网络流量,是否会发送 POST,响应中是否有 Access-Control-Allow-Origin 标头? 除非您尝试跨域,否则不应使用 XDomainRequest;如果用户在 InPrivate 模式下运行,该对象会遇到几个错误,包括在 IE8 中完全失败。如果您最终确实需要跨域,您的代码在 IE10 中更喜欢 XDomainRequest 而不是 CORS-XHR;它可能不应该。 感谢埃里克的信息。响应确实有 Access-Control-Allow-Origin 标头。我感到沮丧并尝试了$.ajax() 电话,并且有效。我认为我的问题是我按照您的建议使用 XDR 【参考方案1】:

通常,如果您从一个域发帖到另一个域,或者如果您从 http 源发帖到 https 端点(即使在同一个域上),也会看到此消息。

你试过设置这个标题吗?

Access-Control-Allow-Origin", "*"

显然,使用 * 有点过于宽泛,您需要缩小范围,但看看是否能解决您的问题。

【讨论】:

这是有道理的,但据我所知,我不会发布到不同的域,也不会通过不同的协议发布。我很确定我已经设置好了。如果您阅读了我的问题的最后几行,我遵循了一个指南,该指南解释了如何添加该标题,但它似乎没有帮助。 FWIW,如果您尝试使用 XDR 从 http->https 访问,IE 会立即失败,而不会出现相关错误消息,反之亦然。 blogs.msdn.com/b/ieinternals/archive/2010/05/13/…

以上是关于IE XdomainRequest CORS 问题的主要内容,如果未能解决你的问题,请参考以下文章

带有 CORS 和 IE9 的 ASP Web API POST 请求(XDomainRequest 对象)

为什么ie8 CORS / XDomainRequest不发送cookie?

IE8/IE9 中的跨域标头

C# 实现CORS

前端ajax+cors+post跨域对于IE兼容性分析

IE、XDomainRequest 并不总是有效