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 类。

此代码第一次运行时,它会正确显示结果。当代码第二次运行时,它会失败并显示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标头(即正确的)。然后它会收到初始回复的其余部分,并因协议错误而失败。

Wireshark 捕获

HTTPWebRequest客户端 ( ) 并没有完全关闭连接,这似乎很奇怪。

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

我已经将问题代码减少到最低限度并使用 MSDN 示例对其进行了复制,但是有人知道这是已知问题还是我们(.NET 或 Squid)配置中的问题?

4

3 回答 3

1

由于它只失败了第二次,会

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 回答