13

オブジェクトを使用し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番目の認証された要求を送信します。正しい)。その後、残りの初期応答を受信し、プロトコルエラーで失敗します。

Wiresharkのキャプチャ

HTTPWebRequestただし、クライアント( )が接続を正常に閉じないのは奇妙に思えます。

プロキシが使用されていない場合(ポート80または内部トラフィック以外)、要求はすべて期待どおりに機能します。認証がない場合は、単一の要求のみを行うため、これも機能します。

問題のコードを最小限に抑え、MSDNサンプルで再現しましたが、これが既知の問題なのか、(。NETまたはSquid)構成の問題なのか誰かが知っていますか?

4

3 に答える 3

1

2回目だけ失敗するので、

request.KeepAlive = false;

違いが生じる・異なる?

于 2012-06-25T13:48:15.957 に答える
0

NTLM認証(NetworkCredential)は、SQUIDの透過プロキシ機能と同時に機能しないと思います。:-(

http://www.squid-cache.org/mail-archive/squid-users/201110/0025.html

別の認証スキームを試してみませんか?

于 2012-06-20T12:45:09.870 に答える
0

自分を認証してみてください

request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes(username + ":" + password));

の前にrequest.GetResponse();

これは私のために働いた。最初に自分で弦全体を入れてみましたが、うまくいきませんでした!

于 2012-08-13T16:10:34.447 に答える