1

クライアントにプッシュバックできるフィードバックを表示するために部分ビューをカプセル化しようとしていました。

この記事では、HTML5 Server-Sent events (SSE) を使用してデータをプッシュバックする方法を示します。

複数のブラウザー タブを開いてから 1 つを閉じると、ロジックがそれぞれのストリームを ConcurrentQueue から削除しなかったため、例外が発生することに気付きました。以下のようにコードを修正しました

    private static void TimerCallback(object state)
    {
        StreamWriter data;
        Random randNum = new Random();
        //      foreach (var data in _streammessage)
        for (int x = 0; x < _streammessage.Count; x++)
        {
            _streammessage.TryDequeue(out data);
            data.WriteLine("data:" + randNum.Next(30, 100) + "\n");
            try
            {
                data.Flush();
                _streammessage.Enqueue(data);
            }
            catch (Exception ex)
            {
                // dont re-add the stream as an error ocurred presumable the client has lost connection
            }
        }
        //To set timer with random interval
        _timer.Value.Change(TimeSpan.FromMilliseconds(randNum.Next(1, 3) * 500), TimeSpan.FromMilliseconds(-1));

    }

フレームワークの構文が HttpContentHeaders ではなく HttpContent である 2 番目のパラメーターに変更されたため、OnStreamAvailable メンバーも修正する必要がありました。

 public static void OnStreamAvailable(Stream stream, HttpContent headers, TransportContext context)

問題は、クライアントを追加または削除すると、まだ一貫性のない動作が得られることです。つまり、新しいクライアントを初期化しようとするとタイムアウトになります。WinAPI で SSE を使用し、切断されたクライアントを処理するための正しい「メソッドのフレームワーク」のアイデアや例を誰かが持っていますか?

乾杯ティム

4

1 に答える 1

1

この記事は、実際には 5 月の元の記事 ( http://www.strathweb.com/2012/05/native-html5-push-notifications-with-asp-net-web-api-and-knockout-js ) を翻案したものです。 / (変数名とポート番号も同じであることに注意してください :-)。

あなたが提起しているのは非常に有効な点であり、切断された接続を検出することは、このセットアップでは非常に簡単ではありません. 主な理由は、ASP.NET (ホスト) では切断された接続を確認できますが、ASP.NET (ホスト) と Web API の間にはそれを通知する通知メカニズムがないためです。

そのため、切断された接続 (切断されたクライアント) を検出するには、実際にストリームへの書き込みを試み、エラーをキャッチする必要があります。これは、クライアントが切断されたことを意味します。

私は aspconf で Brad Wilson/Marcin Dobosz/Damien Edwards に同じ質問をしましたが、Damien は使用を提案しました。つまり、HttpContext.Current.Response.IsClientConnected基本的に Web API をバイパスし、基盤となるホストから直接接続情報を取得します (ただし、競合状態は依然として関係しています)。それはまさに .NET 4 です。彼はまた、非同期キャンセル トークンを使用して .NET 4.5 でこの問題を回避できる興味深い方法を指摘しました。率直に言って、私はそれをテストしたことがありませんが、おそらくこれはあなたが探求すべきものです.

この問題に対する彼らの反応は、このビデオ ( http://channel9.msdn.com/Events/aspConf/aspConf/Ask-The-Experts ) で見ることができます- 48:00 まで早送りします。

于 2012-10-20T20:26:51.803 に答える