我们正在使用这些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 类。
此代码第一次运行时,它会正确显示结果。当代码第二次运行时,它会失败并显示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 上,重新启动进程会使其恢复并运行一次,但 Server 2003 需要完全重新启动。
查看网络捕获,两个请求一开始是相同的,发送初始未经身份验证的请求并且服务器回复,但失败的请求在初始回复中间发送第二个经过身份验证的请求,就好像它忽略了Content-Length
标头(即正确的)。然后它会收到初始回复的其余部分,并因协议错误而失败。
HTTPWebRequest
客户端 ( ) 并没有完全关闭连接,这似乎很奇怪。
当代理未使用时(非端口 80 或内部流量),所有请求都按预期工作。当没有身份验证时,它也可以工作,因为它只发出单个请求。
我已经将问题代码减少到最低限度并使用 MSDN 示例对其进行了复制,但是有人知道这是已知问题还是我们(.NET 或 Squid)配置中的问题?