CORS,IIS - 有史以来最奇怪的失败

时间:2013-04-12 14:26:53

标签: jquery ajax apache iis cors

我有一台Microsoft IIS服务器(通过TMG防火墙)。我有Apache服务器(不同的位置,没有防火墙)。我的IIS服务器提供数据文件(纯文本,实际上是CSV)。

Apache服务器提供简单的HTML页面,通过jQuery.ajax()方法从IIS服务器加载数据。或者,IE8上的XDomainRequest()也许是9.(作为$.ajax传输)。

这是我的web.config包含数据的目录:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <location path=".">
    <system.webServer>
      <httpProtocol>
        <customHeaders>
          <add name="Access-Control-Allow-Origin" value="*" />
          <add name="Access-Control-Allow-Methods" value="GET,POST" />
          <add name="Access-Control-Allow-Headers" value="Content-Type" />
        </customHeaders>
      </httpProtocol>
    </system.webServer>
  </location>
</configuration>

以下是测试:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>CORS TEST</title>
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
        <script>
            $(function () {
                var h2 = $('h2:first');
                    h3 = $('h3:first');
                h3.text(navigator.userAgent);
                $.ajax({
                    url : '//my.iis.site.net/ajax/data/test.csv',
                    method : 'GET'
                })
                .done(function() {
                   h2.text('WORKS.'); 
                })
                .fail(function() {
                   h2.text('FAILED.'); 
                });
            });
        </script>
    </head>
    <body>
        <h1>CORS TEST:</h1>
        <h2></h2>
        <h3></h3>
    </body>
</html>

我测试了所有支持CORS的指定浏览器。还有一些移动的。我无法让它失败。它完全适用于本书。

在我们的团队在工作中测试此配置后,我们发现将新网站提供给更广泛的受众群体是可以的。而且一切都崩溃了。

大多数人都说它有效。但是大量(绝对超过10%)的人说它不起作用。我担心它会超过10%,甚至可能达到50%。

这是最糟糕的情况:2人,但几乎(或完全)相同的软件(操作系统,配置,程序,ISP,浏览器)。一个人看到AJAX数据,另一个人看不到。

相同的操作系统,相同的浏览器(在两台计算机上使用3种不同的浏览器进行测试,版本完全相同,并且使用相同的ISP)。

在某些计算机上,无论如何,CORS都无法正常工作!

是的,他们清除了所有浏览器缓存。没有帮助。

浏览器不会在控制台中抛出任何错误,$.ajax()方法只会触发.fail()方法,而不是.done()。我不知道如何测试它,因为在我的机器上它始终有效。即使在我的所有移动设备和GSM网络上,它也可以作为魅力。即使是相当古老的Android版本和相当旧的默认浏览器。无论我不能让它失败,就像有些人无法让它在任何计算机或移动设备上运行一样。

它有什么邪恶的魔力?我应该忘记CORS并切换到JSONP传输吗?

我不使用JSONP的原因。数据服务器将收到巨大的流量。数据每500毫秒更新一次,并且会经常由数千名用户重新加载(即使速度为500毫秒)。在我的IIS服务器上的每个请求上执行脚本不是最好的主意。它可能会对性能产生很大的负面影响。

任何线索?将数据压缩为PNG并通过JS解压缩? :)这是一个疯狂的黑客。 CORS并不疯狂,但这就是我得到的。

任何想法我怎么能开始测试它?也许这是jQuery中的一个错误,但我对此表示怀疑。即使请求脚本从同一域运行,无法通过CORS访问文件的人也无法访问它们。我不得不删除web.config以使AJAX在同一个域上工作。

2 个答案:

答案 0 :(得分:1)

如果将web.config文件放在Web应用程序的子目录中,则必须将该子目录转换为IIS管理器中的应用程序。否则,它会为此子目录的每个请求提供错误500。

有人在一台服务器上将其转换为Web应用程序,但在另一台服务器上却没有。这就是为什么一些用户获得数据,而一些错误500而不是数据。

答案 1 :(得分:-1)

确保您的客户端不在代理服务器或防火墙后面。某些代理服务器或防火墙可能会阻止或自动响应预检选项请求。

同样在ur服务器web.config文件的处理程序部分添加

<handlers>
      <remove name="OPTIONSVerbHandler" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>