0

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

Apache 服务器提供简单的 HTML 页面,该页面通过jQuery.ajax()方法从 IIS 服务器加载数据。或者,XDomainRequest()在 IE8 和 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 在同一个域上工作。

4

2 回答 2

1

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

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

于 2013-05-09T09:57:24.780 回答
-1

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

同样在您的服务器 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>
于 2016-11-03T16:14:05.410 回答