#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 (и, следовательно, не получает фрейм закрытия).