我们正在使用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
标题(这是正确的)。然后它接收剩余的初始回复,并因协议错误而失败。
但客户端(HTTPWebRequest
)并没有干净地关闭连接,这似乎很奇怪。
当代理未被使用时(非端口80或内部流量),请求全部按预期工作。如果没有身份验证,它也可以工作,因为它只发出单个请求。
我已经将问题代码减少到最小并使用MSDN示例重现它,但是有人知道这是否是我们(.NET或Squid)配置中的已知问题或问题?
答案 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();
之前
这对我有用。首先,我尝试自己输入整个字符串,这不起作用!