我已经在我的应用程序中实现了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:每个标签页只有一个通道可以降低这种情况发生的频率。但它并不能完全解决问题。
有时候,在通道存在一段时间后,它会断开连接。我可以在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:每个标签页只有一个通道可以降低这种情况发生的频率。但它并不能完全解决问题。