Play Framework WebSocket断开IE客户端

时间:2014-06-19 00:51:36

标签: scala internet-explorer playframework websocket akka

我已经在Play Framework论坛上提问,但我想在这里也要问一下额外的报道:

使用Play Framework 2.3,我有一个WebSocket处理一个演员,我用它来推动" StatusUpdate"发送给已连接客户的消息:

def updateSocket = WebSocket.tryAcceptWithActor[StatusUpdate, StatusUpdate] { 
  implicit request =>
    authorized(Set.empty[SecurityRole]).map {
      case Right(user) => 
         Right({upstream => DashboardListener.props(upstream, user.dblocations)})
      case Left(_) => 
         Left(Forbidden)
    }
 }

一切都很美妙,除了......

当用户通过Internet Explorer连接,并且IE窗口失去焦点时,WebSocket会在20秒左右强行关闭。到目前为止,Firefox似乎没有表现出这种行为。我使用Fiddler检查WebSocket流量,看起来IE正在发送一个" pong"失去焦点后的消息:

{"doneTime": "02:08:39.462","messageType": "Pong","messageID": "Client.2",
"wsSession":"WSSession-1","payload": "", "requestPartCount": "1"}

服务器立即发送:

{"doneTime": "02:08:39.462","messageType": "Close","messageID": "Server.3",
 "wsSession": "WSSession-1","payload": "03-EB-54-68-69-73-20-57-65-62-53-6F-
 63-6B-65-74-20-64-6F-65-73-20-6E-6F-74-20-68-61-6E-64-6C-65-20-66-72-61-6D-
 65-73-20-6F-66-20-74-68-61-74-20-74-79-70-65", "requestPartCount": "1"}

我假设这是因为我的WebSocket不知道如何处理pongs(因为我已经声明传入和传出流量属于StatusUpdate类型)。此外,客户端接收带有代码1003的closeEvent(连接正在终止,因为端点接收到它不能接受的类型的数据)。我做了一些研究,似乎这个ping / pong应该保持连接存活,但不会暴露给API。有没有人遇到这个问题或知道潜在的解决方案?

如果重要,客户端只能通过此套接字接收StatusUpdates - 在任何情况下都不会在其上明确发送任何类型的消息。 StatusUpdate消息源自我的Actor系统中的其他位置。

0 个答案:

没有答案