2009-04-17 18 views
1

私はCometのASP.NETで書かれたアプリケーションで作業します。アクティブな接続コンテキストの配列があります(HttpContext)。また、コレクションを定期的に反復してその状態をチェックするスレッドがあります。したがって、アプリケーションアーキテクチャは要求ごとのスレッドではありません。ASP.NETで接続がアクティブであることを確認する

接続がアクティブである(リモートホストによって閉じられていない)ことを確認する最善の方法は何ですか?

私はこれが見つかりました:

context.Response.Write(' '); 
context.Response.Flush(); 

if (!context.Response.IsClientConnected) 
{ 
    // ... 
} 

をしかし、それが処理するスレッドの時間がかかるので、それは良い解決策ではありません()(フラッシュ操作をブロックしています)。多くの同時接続で非常に高速に動作するソリューションが必要であり、ブロッキング操作は使用しません。

多分IISやASP.NETの機能があり、このように接続を監視できますか?

答えて

2

短い答えはいいですね。 IsClientConnectedに対してfalseを返すことをASP.NETが知る唯一の方法は、ユーザーがサーバーに対して別の呼び出しを行うか、以前にResponse.Closeが呼び出された場合です。私の経験上、ユーザーが接続を閉じて、IsClientConnectedをtrueに戻すことは可能です。基本的なHTTP通信が行われていることを考えれば、その理由を知ることができます。

あなたは何を達成しようとしていますか?

+0

これは、Flashクライアント側のチャットサービスです。これは、クライアントがオフラインになったときを判断する方法です。 – alexey

+0

"基本的なHTTP通信"の理由がわかりません。 HTTPは一般的にTCP上のストリームです。クライアントが接続を閉じた場合、TCPストリームは壊れています(これはクリーンTCPシャットダウンで検出可能なイベントです。「FIN」を参照してください。 HTTP接続自体は(このHTTPストリームに接続できる将来のTCP接続がないため)閉じられていることがわかります。 Cometは長時間実行されているHTTPストリームなので違いはありません。 – user2864740

+0

http://stackoverflow.com/questions/33449876/how-does-asp-net-httpresponse-isclientconnected-work – user2864740

関連する問題