我使用 Channel API 的 Google App Engine 应用程序在某些时候运行良好。但是,连接到通道的 js 代码会间歇性地产生错误。在 socket.onError 中,错误代码设置为 400,描述设置为空字符串。我已检查用于连接的令牌是否有效。我还尝试通过首先调用 socket.close() 在 socket.onError 中重新创建通道,但这似乎不起作用。通常在成功之前会有一系列的失败。客户端 js 在 iOS 上的 Safari 上运行。任何关于如何解决或解决问题的想法都将受到欢迎。现在,我最好的解决方法是继续尝试直到成功,增加每次失败尝试之间的间隔。服务器端存在 API 没有帮助,因为“已连接”钩子没有被可靠地调用。
3 回答
已知问题http://code.google.com/p/googleappengine/issues/detail?id=4940并被接受。如您所见,问题的状态未修复。随意给它加星标。
我知道重复发布是不好的(问题已加星标和评论已发布)......但我怀疑这个线程可能会比问题评论更受关注^^
就我们而言,这至少是一个文档问题:
https://developers.google.com/appengine/docs/java/channel/javascript仍然声明“ onerror 调用后总是跟着 onclose 调用,并且必须在此事件之后重新创建通道对象”
据我们猜测,这仅适用于错误代码 400 和 401(它们是字符串,而不是数字,顺便说一句,因此请注意 js 代码中的 ===)。
其他错误代码是不正确的(我们至少记录了 -1 代码)。
应该有一个涵盖所有错误代码及其(预期)管理的文档。
Atm,我们有一个“通道管理器”,它在代码不是400 或 401 时重用相同的通道令牌,并确保每个 Socket 只调用一次 onclose。
在此之前,我们试图正确关闭,并使用闪亮的全新令牌重新打开(新的底层 Socket):通常我们得到一个错误 400,然后是一个错误 -1。
FUI 我们最近在 iOS 上首次检测到了这种行为(回归 ftw?在那之前,iOS 是花花公子)。在代码 -1 之后重新打开套接字并不是灵丹妙药:有时它会成功(正确调用 onopen),然后静默失败(没有收到消息,没有调用 onerror)。
一般来说,我们还注意到桌面浏览器在所有用户代理和平台上的行为比移动浏览器更一致(更多信息:耶!其他问题传入!尤其是安卓......)
好的,毕竟这篇文章可能很有用。谢谢!
[编辑:更正了一个错误......我们不重用通道对象或套接字对象,只重用令牌]
我就这个问题联系了 Google 支持。
当发生错误 400 时,这是因为发生了超时(似乎是一分钟)。此超时会产生断开连接(调用断开连接的 url,您应该删除数据库的客户端 ID)。然后,必须使用新的客户端 ID 创建一个新通道。
但这还不够。我们必须使用这个 jquery 命令行: $('#wcs-iframe').remove();
就在 js onerror 函数内部和之前尝试重新创建通道。