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