Сервер ASP.NET MVC 4.5 WebSocket теряет соединение после передачи нескольких сообщений

Я только начал играть с WebSockets и ASP.NET и столкнулся с какой-то странной проблемой. Я создаю очень примитивное приложение ASP.NET 4.5 WebAPI, которое должно функционировать как эхо-сервер:

using Microsoft.Web.WebSockets;
// ...
namespace MyControllers
{ internal class EchoHandler : WebSocketHandler { public override void OnClose() { System.Diagnostics.Debug.Write("Close"); } public override void OnError() { System.Diagnostics.Debug.Write("Error: " + this.Error.ToString()); } public override void OnOpen() { System.Diagnostics.Debug.Write("Open"); } public override void OnMessage(string message) { System.Diagnostics.Debug.Write("Message: " + message); this.Send("Echo: " + message); } } public class EchoController : ApiController { public HttpResponseMessage Get() { if (HttpContext.Current.IsWebSocketRequest) { HttpContext.Current.AcceptWebSocketRequest(new EchoHandler()); return Request.CreateResponse(HttpStatusCode.SwitchingProtocols); } else { return Request.CreateResponse(HttpStatusCode.BadRequest); } } }
}

Я подключаюсь к этой службе, используя приложение Windows Store, написанное на С#. Соответствующий код выглядит следующим образом:

class WebsocketTest
{ private MessageWebSocket webSocket; private DataWriter messageWriter; private async Task Connect() { var server = new Uri("ws://127.0.0.1:81/"); webSocket = new MessageWebSocket(); webSocket.Control.MessageType = SocketMessageType.Utf8; webSocket.MessageReceived += messageWebSocket_MessageReceived; webSocket.Closed += messageWebSocket_Closed; await webSocket.ConnectAsync(server); messageWebSocket = webSocket; messageWriter = new DataWriter(webSocket.OutputStream); } private async Task Send(string message) { try { messageWriter.WriteString(message); await messageWriter.StoreAsync(); } catch (Exception ex) { var error = WebSocketError.GetStatus(ex.GetBaseException().HResult); } }
}

Это хорошо работает некоторое время, но после того, как на сервер отправлено произвольное количество сообщений, OnError() вызывается на сервере, и я получаю следующее исключение: "Операция ввода-вывода была прервана из-за нити выход или запрос приложения "(это" this.Send(...) ", который, кажется, вызывает его). Если я продолжаю отправлять данные на клиенте, я получаю ошибку "ConnectionAborted" при вызове "dataWriter.StoreAsync()". Ошибка возникает каждый раз, но до этого требуется различное количество сообщений. Использование более длинных сообщений, похоже, ускоряет процесс.

Для тестирования я также пытался использовать простые AspNetWebSockets вместо WebSocketHandler, но с тем же результатом.

Есть идеи?

Спасибо за тонну заранее, Кай

1 ответ

Его ошибка (сообщенная мной): https://connect.microsoft.com/VisualStudio/feedbackdetail/view/976851/server-websocket-closed-abruptly-the-io-operation-has-been-aborted-because-of-either-a-thread-exit- или-ан-приложение-запрос

Я пытался найти обходное решение довольно долгое время, не будучи успешным. Я использую HttpListener но симптом тот же. Теперь я изменил реализацию в стороннюю библиотеку, и проблема, похоже, была решена.

licensed under cc by-sa 3.0 with attribution.