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