2016-03-25 17 views
7

公式のドキュメントはありませんが、誰もがASP.NETコアを使用してSSEを実装する方法を知っていますか?ASPNETコアサーバー送信イベント/応答のフラッシュ

1つの実装でカスタムミドルウェアが使用されている可能性がありますが、コントローラのアクションでこれを行うことは可能でしょうか?

+0

あなたはSignalRの話されていますか? – Tseng

+0

いいえ、SignalR for Coreはまだありません。 – Zygimantas

+0

SignalR3は、公式のナゲットフィードとmygetの厩舎https://www.myget.org/gallery/aspnetmasterとnightliesの両方でrc1-finalで入手できます。それが私が尋ねた理由です。しかし、ロードマップに記載されているようにASP.NET Core 1.0がリリースされても、リリース準備はできません。https://github.com/aspnet/Home/wiki/Roadmap – Tseng

答えて

24

wwwrootに/ index.htmlを

、ページの読み込みで、http://www.somehost.ca/sse URLに対するEventSourceを作成します。次に、そのイベントをコンソールに書き込みます。

<body> 
    <script type="text/javascript"> 

     var source = new EventSource('sse'); 

     source.onmessage = function (event) { 
      console.log('onmessage: ' + event.data); 
     }; 

     source.onopen = function(event) { 
      console.log('onopen'); 
     }; 

     source.onerror = function(event) { 
      console.log('onerror'); 
     } 

    </script> 
</body> 

ミドルウェア

ミドルウェアはsseパスを処理します。サーバーソケットイベントに必要なtext/event-streamContent-Typeヘッダーを設定します。接続を閉じずに応答ストリームに書き込みます。書き込みの間に5秒間遅らせることで、仕事をすることを模倣します。

app.Use(async (context, next) => 
{ 
    if (context.Request.Path.ToString().Equals("/sse")) 
    { 
     var response = context.Response; 
     response.Headers.Add("Content-Type", "text/event-stream"); 

     for(var i = 0; true; ++i) 
     { 
      // WriteAsync requires `using Microsoft.AspNetCore.Http` 
      await response 
       .WriteAsync($"data: Middleware {i} at {DateTime.Now}\r\r"); 

      response.Body.Flush(); 
      await Task.Delay(5 * 1000); 
     } 
    } 

    await next.Invoke(); 
}); 

コントローラ

コントローラは、ミドルウェアがないとまったく同じことを行います。 Firefoxの

[Route("/api/sse")] 
public class ServerSentEventController 
{ 
    private readonly IHttpContextAccessor _httpContextAccessor; 

    public ServerSentEventController(
     IHttpContextAccessor httpContextAccessor) 
    { 
     _httpContextAccessor = httpContextAccessor; 
    } 

    [HttpGet] 
    public async Task Get() 
    { 
     var response = _httpContextAccessor.HttpContext.Response; 
     response.Headers.Add("Content-Type", "text/event-stream"); 

     for(var i = 0; true; ++i) 
     { 
      await response 
       .WriteAsync($"data: Controller {i} at {DateTime.Now}\r\r"); 

      response.Body.Flush(); 
      await Task.Delay(5 * 1000); 
     } 
    } 
} 

コンソール出力は、これはFirefoxのコンソールウィンドウに結果です。 5秒ごとに新しいメッセージが届きます。

onopen 
onmessage: Message 0 at 4/15/2016 3:39:04 PM 
onmessage: Message 1 at 4/15/2016 3:39:09 PM 
onmessage: Message 2 at 4/15/2016 3:39:14 PM 
onmessage: Message 3 at 4/15/2016 3:39:19 PM 
onmessage: Message 4 at 4/15/2016 3:39:24 PM 

参考文献:

+1

Shaunありがとう、あなたの答えは非常に包括的に見えます。私はすぐに評判のポイントを転送する、私はまだローカルマシンとアズールでRC1でこれを再現する問題を抱えています。レスポンスが各繰り返しでフラッシュされないようです。おそらく、RC2以前に移行するのはいい時期かもしれません。 – Zygimantas

+0

@ Zygimantas RC2より前に移行するのは間違いなく良い時期です。私はRC1で上記を試していません。 RC2以前の作業では苦痛を伴うことがありますが、痛みを感じながら作業するには大量の学習が必要です。 –

+1

出血の端に押していただきありがとうございます:)今はRC2ではなく、RC2以前のものであることを確認できます。 – Zygimantas

関連する問題