SockJS遇到IE9问题

时间:2012-11-16 12:56:54

标签: https internet-explorer-9 tornado sockjs

我在这里看到了类似失败的报告:https://groups.google.com/forum/?fromgroups=#!topic/sockjs/QNtA1_p_arU,但我的问题似乎有所不同。

我的设置:客户端连接到https://www.mysite.com/sockjs用于SockJS,实际页面在https://www.mysite.com/blah/blah/blah提供。页面上的所有外部元素(例如css和js)都使用 https ,包括SockJS-Client(https://d1fxtkz8shb9d2.cloudfront.net/sockjs-0.3.js,应为0.3。 4为最新版本)。后端由SockJS-Tornado制作。

问题1 :我指定使用以下协议:

var options = {protocols_whitelist: ["websocket", "xhr-streaming", "xdr-streaming", "xhr-polling", "xdr-polling", "iframe-htmlfile", "iframe-eventsource", "iframe-xhr-polling"], debug: true};             
conn = new SockJS("https://www.mysite.com/sockjs", options);

然而,似乎IE9只使用最差的协议iframe-htmlfile,因为我在服务器日志中看到以下内容:

INFO:root:200 GET /sockjs/info?t=1353062888578 (127.0.0.1) 0.51ms
INFO:root:200 GET /sockjs/iframe.html (127.0.0.1) 22.21ms

为什么不使用xdr-streamingxdr-polling?在SockJS doc中,它将这两个协议标记为'IE8,9(cookies = no)',这是否意味着只有在为浏览器禁用cookie时SockJS才会使用它们?

问题2 :使用协议iframe-htmlfile,用户将在页面上收到'Only Secure Content is Displayed'警告,表示混合内容问题。但是,其他测试浏览器都没有报告此警告(例如Chrome,FireFox,Safari),并且如前所述,页面上的每个外部资源都通过https提供。为什么是这样?它与使用的特定协议iframe-htmlfile有关吗?​​

与此同时,SockJS努力连接到服务器并发送消息。这就是我在服务器日志中看到的内容:

INFO:root:200 GET /sockjs/info?t=1353062888578 (127.0.0.1) 0.51ms
INFO:root:200 GET /sockjs/iframe.html (127.0.0.1) 22.21ms
INFO:root:200 GET /sockjs/info?t=1353062922712 (127.0.0.1) 0.39ms
connection openned for: 127.0.0.1
INFO:root:200 GET /sockjs/info?t=1353062963868 (127.0.0.1) 0.36ms
WARNING:root:Read error on 12: [Errno 104] Connection reset by peer
WARNING:root:error on read
Traceback (most recent call last):
  File "/home/ml/envs/.virtualenvs/sockapp/local/lib/python2.7/site-packages/tornado/iostream.py", line 355, in _handle_read
    if self._read_to_buffer() == 0:
  File "/home/ml/envs/.virtualenvs/sockapp/local/lib/python2.7/site-packages/tornado/iostream.py", line 422, in _read_to_buffer
    chunk = self._read_from_socket()
  File "/home/ml/envs/.virtualenvs/sockapp/local/lib/python2.7/site-packages/tornado/iostream.py", line 403, in _read_from_socket
    chunk = self.socket.recv(self.read_chunk_size)
error: [Errno 104] Connection reset by peer
subject disconnection from: None
Message handled in: 0 ms
INFO:root:200 GET /sockjs/369/rpf1d1vl/htmlfile?c=_jp.aepnvri (127.0.0.1) 60006.30ms

最后一个错误似乎是超时。当我在IE9中关闭警告对话框时,连接似乎打开,但之后没有从浏览器收到消息(浏览器应该在连接打开后立即发送消息)。我想知道这是否与之前的混合内容警告有关。

1 个答案:

答案 0 :(得分:5)

我认为我们能够在SockJS邮件列表中找出您的问题。快速回顾:

问题1 - 您的服务器要求客户端仅使用执行cookie的传输(出于负载平衡的原因),这意味着无法使用基于XDR的传输(XDR可以&#t; t做饼干)。

问题2 - 您忘记在服务器端设置sockjs_url参数,以包含来自https(而非http)的sockjs javascript。这就是为什么你有混合内容警告的原因。