Play Framework WebSocket отключение клиентов IE

#scala #internet-explorer #playframework #websocket #akka

#scala #internet-explorer #playframework #веб-сокет #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 теряет фокус, в течение примерно 20 секунд WebSocket принудительно закрывается. 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). Более того, клиент получает closeEvent с кодом 1003 (соединение прерывается, потому что конечная точка получила данные типа, которые она не может принять). Я провел некоторое исследование, и кажется, что этот ping / pong должен поддерживать соединение, но не быть доступным для API. Кто-нибудь сталкивался с этим раньше или знал о потенциальном решении?

Если это имеет значение, клиенты получают обновления статуса только через этот сокет — ни в коем случае на него не отправляется какое-либо сообщение. Сообщения statusUpdate поступают из других мест в моей системе Actor.

Комментарии:

1. Проверьте, действительно ли фреймы, передающие эти данные, являются фреймом pong и закрытым фреймом? или это фреймы данных? tools.ietf.org/html/rfc6455#section-5.5

2. Хорошо, я только что закончил мониторинг трафика с помощью Wireshark — они действительно pong и закрывают фреймы. Я также проверил, что firefox не отправляет фрейм pong (и, следовательно, не получает фрейм закрытия).