2013-08-27 28 views
7

自己ホストプロセスとして動作しているWeb APIを使用してRESTリソースを作成しました。パフォーマンス上の理由から、永続的なHTTP接続を使用して呼び出すことができるようにしたいと考えています。私はOWINセルフホスティングを使用しています。System.Net.Http.HttpClientで永続的な接続を使用することはできますか?

System.Net.Http.HttpClientのGET、POST、PUT、DELETEのasnycメソッドが本当に好きです。彼らは簡単にコールして対処します - 私は何をしようとしているのに便利なSystem.Threading.Tasks.Taskを返します。私はSystem.Net.HttpWebRequestにHttpClientを使用することを好む。

おそらく何かが不足していますが、HttpClientとの永続的な接続を作成する方法はわかりません。私はSystem.Net.Http.HttpClientHandlerクラスとSystem.Net.Http.WebRequestHandlerクラスを掘り下げていますが、これまでは永続的な接続のオプションが見つかりませんでした。 Googleでは、HttpWebRequestを使用して永続的な接続を作成するさまざまな例を見つけました。 trueに設定できるKeepAliveプロパティがあります。これをHttpClientで設定する方法はありますか?

MSDN documentation for HttpClient:デフォルトでは

、HttpWebRequestのは、サーバーに要求を送信するために使用されます。この動作は、HttpMessageHandlerインスタンスをパラメータとして使用してコンストラクタオーバーロードのいずれかに異なるチャネルを指定することによって変更できます。認証やキャッシングなどの機能が必要な場合は、WebRequestHandlerを使用して設定を構成し、インスタンスをコンストラクタに渡すことができます。返されたハンドラは、HttpMessageHandlerパラメータを使用してコンストラクタオーバーロードのいずれかに渡すことができます。

基本となるHttpWebRequestにKeepAlive機能を設定する方法はありますか?

MSDNのドキュメントにも書かれています:

のHttpClientクラスのインスタンスは、HTTPリクエストを送信するためにセッションとして機能します。 HttpClientインスタンスは、そのインスタンスによって実行されるすべての要求に適用される設定の集合です。さらに、すべてのHttpClientインスタンスは、独自の接続プールを使用して、他のHttpClientインスタンスによって実行された要求から要求を分離します。

私は接続プールが性能上の利点が得られるときに永続的な接続を使用して私に最適化することを理解していますか?クライアントからの接続が1つしかないようにするにはどうすればよいですか?

+0

こんにちはへの接続にそれを設定することができます!最終的にそれが可能かどうかを見つけましたか? – vtortola

+0

私はこれを見てからしばらくしています。私が知る限り、それはできません。私は何を試しても、多くのことを試しました、http。sysはそれにトラフィックがなかったので120秒後に接続を強制終了しました。私は、HTTP KeepAliveや他の何かを使ってこの低レベルの動作を変更するために、.NETレイヤーで接続を設定する方法を見つけたことはありませんでした。私は誰かに答えをつけさせるのが大好きです。 – petrsnd

+0

十分に公正です。ありがとう。 – vtortola

答えて

0

私はあなたが解決しようとしていることを正確にはわかりませんが、SignalRを見ましたか?彼らはあなたが探している仕事をするかもしれないかなり派手なwebsocket apiを持っています。

.NET 4.5を使用していない場合は、代替メカニズムがあります。私が使用していると見られるものは、サーバー/イベントストリームのようなものです。

+0

なぜ私は-1か分からないが、あなたのアドバイスに従えば、IHttpClientの実装が面白いかもしれない。 – Developer

0

クライアントのServicePointでMaxIdle時間を設定する必要があります。最も簡単な方法は、すべてのサービスポイントのタイムアウトを設定することです:

ServicePointManager.MaxServicePointIdleTime = Timeout.Infinite; 

あなたはまた、特定のエンドポイント

var sp = ServicePointManager.FindServicePoint(targetUri); 
sp.MasIdleTime = Timeout.Infinite; 
関連する問題