我目前正在使用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流量......它也有效。然而,如果没有fiddler似乎没有任何联系,详见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访问它(因为我们首先认为它可能是某种同源策略问题,所以我得到了重定向),不明白它是如何重要的。至少我希望它不......
欢迎任何想法。
编辑:将站点添加到受信任区域也不起作用。
如果您尝试在本地(Intranet)域上打开websocket,IE看起来会抛出SecurityError。要解决此问题,您可以禁用IE的自动算法来识别本地站点。这可以在Tools > Internet Options > Security > Local Intranet > Sites
完成。
取消选中所有复选框(或者只有特定的复选框,如果您知道您的域在Intranet中的确切结果)。
请注意,IE使用(其中包括)其代理设置来确定本地站点:如果您的域名在代理设置中被列为从代理中排除,那么它可能会被视为内部网站。这就是为什么WebSockets在启用Fiddler时可以工作的原因:它修改了IE代理设置,因此内部网站点列表也发生了变化。
应用安全补丁后,我在Windows 7 / IE11中遇到此问题。对于Windows 10 / Edge来说是同样的故事。
由于这是本地websocket(ws:// localhost),因此您必须将ws:\\localhost\
添加到Internet Explore配置(工具> Internet选项>安全性>本地Intranet>站点>高级)。
在Windows 10 / Microsoft Edge中,您将在“控制面板”>“Internet选项”中找到此配置。
UPDATE
您的webapp(https://test.dev.mydomain.net)的地址也必须添加到本地Intranet区域。请注意,在图像中应添加webapp地址。
好吧,我的问题不是那么成功,所以我会发布我找到的“解决方法”。
我在194.247也得到了该网站的另一个地址。神奇地解决了这个问题。猜猜IE不喜欢混合本地和外部的东西并观看IP。
无论如何,我希望这对任何有同样问题的人都会派上用场。
如果您有通过配置IE来解决“真正”问题的解决方案,请告诉我:)
干杯,
浏览器具有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是创建多个子域。
客户端主机名/ IP地址应与侦听的服务器IP /主机名相同,否则您将收到上述错误。
1)确保服务器主机名是否配置为侦听IP / localhost等,如果没有明确指定主机名ast服务器
2)在客户端使用相同的主机名。这将解决问题。它对我有用......
我遇到了错误(虽然它没有说SCRIPT5022部分,而只是报告“ScriptError”)。我通过点击“可信站点”然后添加托管远程websocket的计算机解决了这个问题。注意,要添加到受信任的站点,
我在客户的某个环境中遇到了同样的问题。事实证明,他们有一个代理配置,不允许直接连接到WebSocket端点,并且不支持WebSocket协议。临时解决方案是禁用代理,一切都开始工作。长期解决方案是编辑代理的配置(.pac文件)以排除WebSocket端点的地址。
要禁用代理,请转到:Internet Explorer选项>连接选项卡>局域网设置按钮>取消选中自动检测设置。
希望这有助于某人。