誰かが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になります。なぜ誰も知っていますか?ハンドシェーク?
使用SignalR http://www.asp.net/signalr –
私は、彼らは今週、それを呼び出しているものは何でもMVC6/MVCコア1.0 /でwebsocketsharpを混合成功を収めてきました。状況はOWINミドルウェアのパイプラインを経由しませんが、別のポートでWebソケットサーバーを実行し、WS接続を処理することができます。思考のためだけの食糧。 – danludwig
未確認でしたが、これを行うための "最も正しい"方法は、 'ExecuteResultAsync'メソッドの中でwebsocketループを使って独自のカスタム実装を定義することだと思われます。その後、コントローラはそのインスタンスを返します。 –