繁体   English   中英

CORS、IIS——有史以来最奇怪的失败

[英]CORS, IIS - the strangest failure ever

我有一个 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 在同一个域上工作。

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

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

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

同样在你的服务器 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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM