我们正在使用 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)配置方面的问题?