2016-05-27 15 views
0

"Microsoft.AspNetCore.WebSockets.Server": "0.1.0-rc2-final"を使用してwebsocketサーバーを作成しますが、動作しません。ASP.NET Core RC2でwebsocketサーバーを作成するには?

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は自分のマネージャークラスです:

は、ここに私のコードです(RC1では、...それは1.0.0-RC1-最終的なもので、それが正常に動作します)。 そして、ここでは、私は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

あなたは、ASP.NET CoreでSignalR機能を使用しようとしていますか? –

+0

@JanshairKhanいいえ、私はちょうどゲームサーバーのトランスポート層としてシンプルなwebsocketリスナーを作りたいと思っています。 –

+0

Windows Server 2008 R2以降で開発してテストしていますか?私の知る限り、WebSocketはクライアントOS上でサポートされていません(少なくともWindows 7を含む)。Win8/10についてはわかりません.Windows Server 2008 R2以上が必要です。サポートされていないOSで実行する場合は、長いポーリングまたは同様の手法にフォールバックする必要があります。 WebSocketはどこでもサポートされていないので、SignalRはこれを行います – Tseng

答えて

3

WebsocketManager.Handle(webSocket, handler); これ以外の場合、要求は終了し、リソースは廃棄されます。

+0

クールな同じ問題、別のコードXDありがとう@ Tratcher –

+2

誰もが修正された完全なコードの例を投稿することができます(私は問題をASP.NETのコアで実装している) –

関連する問題