Web サーバーからデータをログに記録する C# アプリケーションを開発しています。次の投稿リクエストを Web サーバーに送信し、応答を待ちます。
/// <summary>
/// Function for obtaining testCgi data
/// </summary>
/// <param name="Parameters"></param>
/// <returns></returns>
private string HttpmyPost(string Parameters)
{
string str = "No response";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uriTestCGI);
request.Method = "POST";
byte[] bytes = Encoding.UTF8.GetBytes(Parameters);
request.ContentLength = bytes.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(bytes, 0, bytes.Length);
requestStream.Close();
WebResponse response = request.GetResponse();
Stream stream = response.GetResponseStream();
StreamReader reader = new StreamReader(stream);
try
{
var result = reader.ReadToEnd();
stream.Dispose();
str = result.ToString();
reader.Dispose();
}
catch (WebException ex)
{
//System.Windows.Forms.MessageBox.Show(ex.Message);
System.Diagnostics.Trace.WriteLine(ex.Message);
}
finally
{
request.Abort();
}
return str;
}
エラーが発生しています
> "The underlying connection was closed: The connection was closed
> unexpectedly"
エラーをデバッグしようとしましたが、Firefox からの投稿要求を確認するためにフィドラーを使用しました。驚いたことに、Fiddler が私のプログラムであったときはいつでも、完全に機能していました。フィドラーを閉じると、同じエラーが発生します。
Fiddler はプロキシとして機能しているため、一部の設定が変更される可能性があると思われます。webclient を使用してみましたが、結果は同じでした。
Pythonでリクエストをコーディングしようとしたところ、問題なく正常に動作しました。もちろん、IronPython をインストールしてその特定の関数をラップするオプションもありますが、これはやり過ぎであり、エレガントさに欠けると考えているため、より無駄のないアプローチを追求しています。これは設定の調整にすぎないと思います。
私は変更を試みましたが、私の場合は無関心です。
request.Accept
request.ReadWriteTimeout
request.Timeout
request.UserAgent
request.Headers
request.AutomaticDecompression
request.Referer
request.AllowAutoRedirect
//request.TransferEncoding
request.Expect
request.ServicePoint.Expect100Continue
request.PreAuthenticate
request.KeepAlive
request.ProtocolVersion
request.ContentType
上記の調整の有無にかかわらず、コードは Fiddler がデータをキャプチャしているときに機能します。
また、プログラムが次の場所でエラーを生成することも注目に値するかもしれません
WebResponse response = request.GetResponse();
更新: @EricLaw の提案に従って、レイテンシーを調査しました。 Nagle アルゴリズムの有効化を提案する間隔を追加すると、この記事 HttpWebRequest が遅くなることがわかりました。現在、閉じられた接続はありませんが、全体的な応答にわずかな遅れがあります (非同期ではなく winform を使用する場合)。