2017-08-29 9 views
0

Webソケットを開いてエンドユーザーに接続できますが、特定のルートを経由するだけですか?Open Web Socket現在のルートに依存C#asp net core

のは、私は以下の機能を持ったWeb APIを持っていると仮定しましょう:ルート上の

  • 記事セクション:ルート上/記事

  • チャットモジュール:/

チャット

現時点では、エンドユーザーが使用するルート上ですべてのws要求を独立して処理するWebソケットミドルウェアがあります。

したがって、理論的には、アプリケーションのフロントレイヤーのどの場所にもWebソケット接続を確立することができます。コードを書くだけであれば可能です。

私はそれが欲しくないので、どうすればそのような状況を防ぐことができますか?

以下は私の現在のソリューションです:

using System; 
using System.IO; 
using System.Net.WebSockets; 
using System.Text; 
using System.Threading; 
using System.Threading.Tasks; 
using Microsoft.AspNetCore.Http; 

namespace chat.Framework 
{ 
    public class WebSocketMiddleware 
    { 
     private readonly RequestDelegate _next; 
     private WebSocketHandler _webSocketHandler; 

     public WebSocketMiddleware(RequestDelegate next, WebSocketHandler webSocketHandler) 
     { 
      _next = next; 
      _webSocketHandler = webSocketHandler; 
     } 

     public async Task Invoke(HttpContext context) 
     { 
      if (!context.WebSockets.IsWebSocketRequest) 
      { 
       await _next.Invoke(context); 

       return; 
      } 

      var socket = await context.WebSockets.AcceptWebSocketAsync(); 
      await _webSocketHandler.OnConnected(socket); 

      await Recive(socket, async(result, buffer) => 
      { 
       if(result.MessageType == WebSocketMessageType.Text) 
       { 
        await _webSocketHandler.Recive(socket, result, buffer); 

        return; 
       } 
       else if (result.MessageType == WebSocketMessageType.Close) 
       { 
        await _webSocketHandler.OnDisconnected(socket); 
        Console.WriteLine("Disconnect"); 
        return; 
       } 
      }); 
     } 

     private async Task Recive(WebSocket socket, Action<WebSocketReceiveResult, byte[]> handle) 
     { 
      var buffer = new ArraySegment<byte>(new Byte[1024 * 4]); 
      WebSocketReceiveResult result = null;   

      var ms = new MemoryStream(); 

      while(socket.State == WebSocketState.Open) 
      { 
       do 
       { 
        result = await socket.ReceiveAsync(buffer, CancellationToken.None); 

       } while (!result.EndOfMessage); 

       var newBuffer = new byte[result.Count]; 
       Array.Copy(buffer.Array, newBuffer, result.Count); 

       handle(result, newBuffer); 
       Console.WriteLine(newBuffer.Length); 
      } 
     } 
    } 
} 
+0

私がチャットサービスをゼロから作成したいのであれば、Webソケットを使用するよりも、SignalRを使用しています。 – Maritim

+0

おそらく私はこのライブラリの現在のバージョンが十分に安定していないので、将来私はSignalRを使用します。そして、次の理由は、今のところライブラリ全体が必要ないということです。 – bielu000

答えて

1

ASP.NETコアミドルウェアは、すべて単一の要求で実行するので、あなたは、ルーティングロジック行いたい場合、あなたはあなたのミドルウェア内部でそれを実装する必要があります。あなたの2つのルートでは、これはかなりシンプルでなければなりません.WebSocketを受け入れる前にInvokeメソッドでcontext.Request.Pathをチェックして、処理する接続の種類を判断してください。

関連する問題