HTTPWebRequest.GetResponse()通过透明代理验证请求失败

时间:2012-06-11 16:46:18

标签: c# httpwebrequest .net-2.0 http-proxy transparentproxy

我们正在使用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需要完全重新启动。

查看network capture,两个请求与开头相同,发送初始未经身份验证的请求,服务器回复,但失败的请求在初始回复过程中发送第二个经过身份验证的请求,就好像它是忽略Content-Length标题(这是正确的)。然后它接收剩余的初始回复,并因协议错误而失败。

Wireshark capture

但客户端(HTTPWebRequest)并没有干净地关闭连接,这似乎很奇怪。

当代理未被使用时(非端口80或内部流量),请求全部按预期工作。如果没有身份验证,它也可以工作,因为它只发出单个请求。

我已经将问题代码减少到最小并使用MSDN示例重现它,但是有人知道这是否是我们(.NET或Squid)配置中的已知问题或问题?

3 个答案:

答案 0 :(得分:1)

因为它只是第二次失败,所以

request.KeepAlive = false;

有所作为?

答案 1 :(得分:0)

我认为NTLM身份验证(NetworkCredential)不能同时使用SQUID的透明代理功能。 : - (

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

您可以尝试其他身份验证方案吗?

答案 2 :(得分:0)

尝试使用

进行身份验证
request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes(username + ":" + password));
request.GetResponse();

之前

这对我有用。首先,我尝试自己输入整个字符串,这不起作用!