Сервер 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.