web-dev-qa-db-ja.com

ASPNET Core Server送信イベント/応答フラッシュ

公式ドキュメントはありませんが、ASP.NET Coreを使用してSSEを実装する方法を知っている人はいますか?

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

15
Zygimantas

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パスを処理します。サーバーソケットイベントが必要とするContent-Typeヘッダーをtext/event-streamに設定します。接続を閉じずに、応答ストリームに書き込みます。書き込みと書き込みの間に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");

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

    await next.Invoke();
});

コントローラー

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

[Route("/api/sse")]
public class ServerSentEventController : Controller
{
    [HttpGet]
    public async Task Get()
    {
        var response = 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のコンソール出力

これは、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

参照:

38
Shaun Luttin