2016-05-27 1 views
0

Я использую «Microsoft.AspNetCore.WebSockets.Server»: «0.1.0-rc2-final», чтобы создать сервер websocket, но не работает. (В rc1, это 1.0.0-rc1-финал, и это работает отлично ...)Как сделать сервер websocket в ASP.NET Core RC2?

Вот мой код:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
     loggerFactory.AddDebug(); 

     app.UseWebSockets(); 

     app.Use(async (http, next) => 
     { 

      if (http.WebSockets.IsWebSocketRequest) 
      { 
       IHandler handler = WebsocketManager.getHandler(http.Request.Path); 
       if (handler == null) 
       { 
        await next(); 
       } 
       else 
       { 
        var webSocket = await http.WebSockets.AcceptWebSocketAsync(); 
        if (webSocket != null && webSocket.State == WebSocketState.Open) 
        { 
         // TODO: Handle the socket here. 
         WebsocketManager.Handle(webSocket, handler); 
        } 
       } 
      } 
      else 
      { 
       // Nothing to do here, pass downstream. 
       await next(); 
      } 
     }); 


     app.UseMvc(); 
    } 

WebsocketManager мой собственный класс менеджер. И вот как я обрабатывать WebSocket сессии:

public async Task Listen() 
    { 
     OnOpen(); 
     while (_webSocket.State == WebSocketState.Open) 
     { 
      var error = String.Empty; 

      try 
      { 
       var buffer = new ArraySegment<Byte>(new Byte[4096]); 
       var received = await _webSocket.ReceiveAsync(buffer, CancellationToken.None); 

       switch (received.MessageType) 
       { 
        case WebSocketMessageType.Close: 
         OnClose(received.CloseStatus, received.CloseStatusDescription); 
         break; 
        case WebSocketMessageType.Text: 
         var data = Encoding.UTF8.GetString(buffer.Array, buffer.Offset, buffer.Count).Trim('\0'); 
         OnMessage(data); 
         break; 
        case WebSocketMessageType.Binary: 
         OnMessage(buffer.Array); 
         break; 
       } 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex); 
       break; 
      } 
     } 
    } 

И потом, «_webSocket.ReceiveAsync» брошено исключение «Запрос был прерван.»

Я уверен, клиент не закрыл сессию.

Как это исправить?

+0

Вы пытаетесь использовать функциональность SignalR в ASP.NET Core? –

+0

@JanshairKhan Нет, я просто хочу, чтобы простой прослушиватель веб-рассылки был как транспортный уровень игрового сервера. –

+0

Вы разрабатываете и тестируете Windows Server 2008 R2 или новее? Насколько я знаю, веб-порты не поддерживаются на клиентской ОС (по крайней мере, вплоть до (включая) Windows 7. Не уверен относительно Win8/10) и требует Windows Server 2008 R2 или новее. Если вы запустите его на неподдерживаемой ОС, вам нужно отступить на длительный опрос или подобные методы. SignalR делает это, потому что WebSockets не поддерживается везде – Tseng

ответ

3

Вы должны await эту строку: WebsocketManager.Handle(webSocket, handler); В противном случае запрос заканчивается, и ресурсы получить расположены.

+0

классная же проблема, другой код XD thanks @Tratcher –

+2

Может ли кто-нибудь опубликовать исправленный полный пример кода (у меня есть проблема с его реализацией в ядре ASP.NET) –

 Смежные вопросы

  • Нет связанных вопросов^_^