2016-02-22 5 views
14

誰かがMVSコントローラ内でWebSocket接続を開いてもらえましたか?MVCコントローラ内のWebSocketチャネルを開く

テクノロジースタック:全体的な一貫性、ルーティング、すでに注入されたリポジトリ、呼び出すためのオプションの: ASPNETコア1.0(RC1)MVC、dnx46、System.Net.WebSockets

なぜMVCの代わりに、ミドルウェア同じコントローラ内のプライベートメソッド。

[HttpGet("v1/resources/{id}")] 
public async Task<IActionResult> GetAsync(string id) 
{ 
    var resource = await this.repository.GetAsync(id); 
    if (resource == null) 
    { 
     return new HttpStatusCodeResult(404); 
    } 

    if (this.HttpContext.WebSockets.IsWebSocketRequest) 
    { 
     var webSocket = await this.HttpContext.WebSockets.AcceptWebSocketAsync(); 
     if (webSocket != null && webSocket.State == WebSocketState.Open) 
     { 
      while (true) 
      { 
       var response = string.Format("Hello! Time {0}", System.DateTime.Now.ToString()); 
       var bytes = System.Text.Encoding.UTF8.GetBytes(response); 

       await webSocket.SendAsync(new System.ArraySegment<byte>(bytes), 
        WebSocketMessageType.Text, true, CancellationToken.None); 

       await Task.Delay(2000); 
      } 
     } 
    } 

    return new HttpStatusCodeResult(101);   
} 

質問:はミドルウェアでのWebSocket接続を処理するのではなく、道を行くの任意の既知の欠点がありますか?ハンドシェークについては、HTTP 101のステータスコードを返すだけでなく、何か他のことをする必要がありますか?

更新1:なぜSignalRですか?フォールバックテクニックを使用する必要はありません。そのため、優れた製品ですが、この状況では依存関係を追加する利点はありません。

アップデート2:私はすでに気づいた1つの欠点 - しばらく(真)が存在する場合(簡単に上の理由から、チャネルがクローズする必要がある場合、たとえば「聞かせて、上記の例で示されていません)、メソッドは何かを返す必要があります(Task)。それは何でしょうか? HTTP 200ステータス応答? WebSocketのドキュメントでは、 "close"フレームの後に何も送信しないでください。

アップデート3:私は、あなたは、Visual Studio 2015でのデバッグは、Windows 10上でIIS Expressの10.0を使用しながら、作業のWebSocketを取得したい場合、あなたはまだhttps://github.com/aspnet/WebSocketsを使用してapp.UseWebSocketsを設定する必要があること、ハードな方法を学んだ一つのこと()をStartup.csファイルに追加します。それ以外の場合、IsWebSocketRequestはfalseになります。なぜ誰も知っていますか?ハンドシェーク?

+0

使用SignalR http://www.asp.net/signalr –

+0

私は、彼らは今週、それを呼び出しているものは何でもMVC6/MVCコア1.0 /でwebsocketsharpを混合成功を収めてきました。状況はOWINミドルウェアのパイプラインを経由しませんが、別のポートでWebソケットサーバーを実行し、WS接続を処理することができます。思考のためだけの食糧。 – danludwig

+3

未確認でしたが、これを行うための "最も正しい"方法は、 'ExecuteResultAsync'メソッドの中でwebsocketループを使って独自のカスタム実装を定義することだと思われます。その後、コントローラはそのインスタンスを返します。 –

答えて

4

  • あなたは、おそらくあなたは、クライアントの切断を検出し、要求を終了while (!HttpContext.RequestAborted.IsCancellationRequested)while(true)を変更したいです。
  • acceptをコールした後、nullまたはwebsocketの状態を確認する必要はありません。

私はそのコードはすべて一時的なもので、実際にはwebsocketから何かを読んでいると仮定しています。

すべての通常のWebSocketの規則が適用されます。

  • 使用SSL(あなたがforrealそれをホストしている)
  • これは、複数のサーバ上で動作しません(それはソケット接続をポイントツーポイントです)
  • 部分フレームの処理をサポートする必要があります。あなたはクライアントが何も送信しないことを知っている場合、これを打つことができます。
+0

ありがとう、素晴らしいヒント!私はサーバー側のソケットから読み込みません。 – Zygimantas

関連する問題