通道API通道断开连接,没有触发onclose或onerror调用。JavaScript控制台记录了对talkgadget.google.com的HTTP调用失败日志。

9
我已经在我的应用程序中实现了Google App Engine的Channel API功能。一切运行顺利。我为每个用户每小时创建一个新的通道。我设法保持每个会话一个通道(同一浏览器中的不同标签使用相同的通道)。我已经以这样的方式实现了onerror和onclose方法,每次调用它们时,都会向服务器发出请求以获取有效令牌。
有时候,在通道存在一段时间后,它会断开连接。我可以在JavaScript控制台上看到对talkgadget.google.com的HTTP调用失败。URL类似于这样:https://129.talkgadget.google.com/talkgadget/dch/bind?VER=8&clid=.....
这些调用的响应会出现"401 (Token timed out)"或"401 (Token invalid)"等信息。实际上,客户端使用的令牌是无效的。它应该使用新令牌进行更新,但是onerror或onclose方法没有被调用。我该如何找到发生这种情况的时间或者如何处理它呢?除了onerror或onclose方法外,没有真正的方法来判断客户端是否已断开连接。如果用户刷新页面,这个问题就会得到解决(每次用户刷新时,我从数据库获取有效的令牌)。
我检查了socket对象的"readyState"属性,它的值为1。许多人都面临这个问题,截至目前,GAE的开发人员似乎没有提供有效的解决方案。
编辑:我是高级账户持有者,这个问题正在阻碍我们的部署。
编辑2:每个标签页只有一个通道可以降低这种情况发生的频率。但它并不能完全解决问题。

这是一个非常棒的问题!它只需要一位Google App Engine工程师提供一个惊人的答案。 - jamesmortensen
1个回答

3
我发表这个问题已经六天了,但是AppEngine团队或其他用户都没有回应。
我采用的解决方法是,在网站上设置一个按钮,该按钮可以从数据库中获取(有效)令牌,关闭通道,然后使用接收到的令牌重新打开通道。有时它是一个新的令牌,本应在之前接收到,有时它是一直有效的相同令牌。
我同意这个问题不能经常复制,但当它发生时,会造成很大的损失。我希望能尽快找到解决方案。
编辑:每个标签页拥有一个通道可以降低出现此问题的频率。但这并不能完全解决问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接