我目前正在使用JavaScript中的WebSockets在IE10(Windows 8)下开发一个网站。它在Firefox 18和Chrome 25下运行良好,但在IE10上,当我建立连接时,我得到一个SecurityError。
我正在做的事情似乎非常简单:
websocket = new WebSocket('wss://hello.dev.mydomain.net');
但是IE并不喜欢它:
SCRIPT5022: SecurityError
脚本在" https://test.dev.mydomain.net" (显然不是真正的地址)。
让我感到困扰的是,如果我只是双击本地计算机上的文件(例如file:// ...),它就可以了。更糟糕的是:如果我使用 fiddler 来监控HTTP流量...... 也可以。然而,如果没有提琴手似乎没有任何联系,详见API的规格。 (见下文。)
根据websocket spec判断,Chrome / Firefox上也会出现例外情况......但事实并非如此。所以我怀疑它有什么与HTTP / HTTPS有关。在任何情况下,我在httpS页面上使用wsS套接字...此外:当我用在线示例中找到的另一个有效服务器替换wss地址时,它可以工作。
我不知道这是否相关,但test.dev.mydomain.net的IP是10.14.x.x,其中hello.dev.mydomain.net是194.247.x.x.我不知道它是否只能触发IE上的某种安全性......
还有一件事:我有* .dev.mydomain.net的证书,IE似乎没有问题。该脚本最初驻留在名为my.name.dev.mydomain.net的服务器上,但由于我从另一个URL访问它(因为我们首先认为它可能是某种同源策略问题,所以我得到了重定向),不知道它是如何重要的。至少我希望它不会......
欢迎任何想法。
编辑:将网站添加到受信任区域也不起作用。
答案 0 :(得分:49)
如果您尝试在本地(Intranet)域上打开websocket,IE看起来会抛出SecurityError。要解决此问题,您可以禁用IE的自动算法来识别本地站点。这可以在Tools > Internet Options > Security > Local Intranet > Sites
。
取消选中所有复选框(或者只有特定的复选框,如果您知道您的域在Intranet中的确切结果)。
请注意,IE使用(其中包括)其代理设置来确定本地站点:如果您的域名在代理设置中被列为从代理中排除,那么它可能会被视为内部网站。这就是为什么WebSockets在启用Fiddler时可以工作的原因:它修改了IE代理设置,因此内部网站点列表也发生了变化。
答案 1 :(得分:7)
好吧,我的问题不是那么成功,所以我会发布我发现的“解决方法”。
我在194.247。。的网站上有另一个地址。神奇地解决了这个问题。猜猜IE不喜欢混合本地和外部的东西并监视IP。
无论如何,我希望这对任何遇到同样问题的人都会派上用场。
如果您有通过配置IE来解决“真正”问题的解决方案,请告诉我:)
干杯,
答案 2 :(得分:6)
在应用安全补丁后,我在Windows7 / IE11 中遇到此问题。对于Windows10 / Edge来说是同一个故事。
由于这是本地websocket(ws:// localhost),您必须将var BaseViewModel = function(options) {
var initialise = function(options) {
if (options) {
if (options.template) {
instance.template = options.template;
}
}
};
var getTemplateId = function() {
return instance.template.Id;
};
var instance = {
template: null,
initialise: initialise,
getTemplateId: getTemplateId
}
return instance
}
添加到Internet Explore配置(工具> Internet选项>安全>本地Intranet>网站>高级)。
在 Windows 10 / Microsoft Edge 中,您将在控制面板>中找到此配置。互联网选项。
<强>更新强>
您的网络地址(https://test.dev.mydomain.net)的地址也必须添加到本地Intranet区域。 注意图片中应添加webapp地址。
答案 3 :(得分:2)
浏览器具有websocket限制。例如,Internet Explorer将每个主机标头名称的websocket连接的默认限制设置为6。对WinForms WebBrowser组件设置了相同的限制。
解决方案是在注册表中的键Computer \HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_WEBSOCKET_MAXCONNECTIONSPERSERVER下添加值。只需添加带有可执行文件名的DWORD值,例如iexplore.exe(如果使用Web浏览器组件,则添加您的应用程序可执行文件名),然后设置2..128范围内的值。
解决SecurityException的第二种方法是创建多个子域。
答案 4 :(得分:1)
客户端主机名/ IP地址应与侦听的服务器IP /主机名相同,否则会出现上述错误。
1)确保服务器主机名是否配置为侦听IP / localhost等,如果没有明确指定主机名ast服务器
2)在客户端使用相同的主机名。这将解决问题。它对我有用......
答案 5 :(得分:0)
我遇到了错误(虽然它没有说SCRIPT5022部分,而只是报告&#34; ScriptError&#34;)。我通过点击&#34; Trusted Sites&#34;来解决这个问题。然后添加托管远程websocket的机器。注意,要添加到可信站点,
我必须提供没有&#34; ws://&#34;的地址。部分(如mymahcine.mydomain.com)
我必须取消选中“#34;要求服务器验证https://&#34;选项。
答案 6 :(得分:0)
我在客户的某个环境中遇到了同样的问题。 事实证明,他们有一个代理配置,不允许直接连接到WebSocket端点,并且不支持WebSocket协议。 临时解决方案是禁用代理,一切都开始工作。长期解决方案是编辑代理的配置(.pac文件)以排除WebSocket端点的地址。
要禁用代理,请转到:Internet Explorer选项&gt; “连接”标签&gt;
希望这有助于某人。
答案 7 :(得分:0)