前提
・WebAPI を利用したプログラムを作成しています。
・この通信のために HttpClient を使用しています。
・この通信は間隔をあけて数回程度、連続して利用することがあります。
・何度か通信を行うと、HttpClient.SendAsync を呼び出したところで応答がなく、そのままの状態が続きます。このとき例外等は発生しません。
実現したいこと
・複数回利用しても HttpClient.SendAsync で固まることなく応答を得られるようにしたい。
発生している問題・エラーメッセージ
・例外やその他のエラーを捕捉出来ていません。ただ固まっているだけのように見えます。
該当のソースコード
以下のコードは説明に不要な部分を除去するなどしているので、不備などがあるかもしれませんがご容赦ください。
実行環境は .NET Framework 4.8 & MVC です。
C#
1static HttpClient client = new HttpClient(); 2 3// var header = new Dictionary< string, string >() { { "param1", "data1" } }; 4// var body = new Dictionary< string, string >() { { "param2", "data2" } }; 5 6void test( string url, Dictionary< string, string > header, Dictionary< string, string > body ) 7{ 8 var request = new HttpRequestMessage( HttpMethod.Post, new System.Uri( url ) ); 9 request.Content = new FormUrlEncodedContent( body ); 10 foreach( var item in header ) request.Headers.Add( item.Key, item.Value ); 11 12 var response = await client.SendAsync( request ); 13 var stream = await response.Content.ReadAsStreamAsync(); 14 15 // stream から応答を受け取って何らかの処理を実施 16}
試したこと
・HttpClient はインスタンスを使い回すとのことなので static 変数にインスタンスを生成して利用していますが、毎回インスタンスを生成するようにしたり、using で囲ったりしましても結果は変わりません。(このような実装が悪影響を及ぼすことは承知しています。変化をみようと試しました。)
・その他の HttpClient に関係するインスタンスのうち IDisposable を継承しているものについて、using で囲ってみましたが、結果は変わりません。
・「何らかの処理を実施」の処理内容を、おもに実行時間が変わるものに変えると、繰り返して使用出来る = 応答がある回数が変わるようです。ただ、その時間が回数に比例などするのか、明確な関連性をつかめていません。
補足情報(まとめ)
しばらく悩んでいたのですが、なにが悪いのか、原因をつかむことが出来ませんでした。
お知恵をお貸しいただければ幸いです。