オブジェクトを使用しHTTPWebRequest
てアプリケーションにHTTPリクエストを送信していますが、リクエストに認証が必要で、透過プロキシ(Squid 3.1.10)がある場合に問題が発生します。
string url = "http://www.icode.co.uk/test/auth.php";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Credentials = new NetworkCredential("username", "password");
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream stream = response.GetResponseStream();
StreamReader reader = new StreamReader(stream);
MessageBox.Show(reader.ReadToEnd());
reader.Close();
stream.Close();
response.Close();
元のコードでは、同じ問題が発生したWebClientクラスを使用していました。
このコードを初めて実行すると、結果が正しく表示されます。コードが2回実行されると、次のGetResponse()
行で失敗します。
System.Net.WebException was unhandled
Message="The server committed a protocol violation. Section=ResponseStatusLine"
Source="System"
StackTrace:
at System.Net.HttpWebRequest.GetResponse()
at Dummy.DummyForm.button1_Click(Object sender, EventArgs e) in H:\Trial\Dummy\DummyForm.cs:line 42
at ...
Windows 7では、プロセスを再起動すると、プロセスが回復して1回動作しますが、Server2003では完全に再起動する必要があります。
ネットワークキャプチャを見ると、最初は2つの要求が同じであり、最初の認証されていない要求が送信され、サーバーが応答しますが、失敗した要求は、Content-Length
ヘッダーを無視しているかのように、最初の応答の途中で2番目の認証された要求を送信します。正しい)。その後、残りの初期応答を受信し、プロトコルエラーで失敗します。
HTTPWebRequest
ただし、クライアント( )が接続を正常に閉じないのは奇妙に思えます。
プロキシが使用されていない場合(ポート80または内部トラフィック以外)、要求はすべて期待どおりに機能します。認証がない場合は、単一の要求のみを行うため、これも機能します。
問題のコードを最小限に抑え、MSDNサンプルで再現しましたが、これが既知の問題なのか、(。NETまたはSquid)構成の問題なのか誰かが知っていますか?