更新:
如果您刚刚遇到这个问题,一般要点是我正在尝试通过代理创建 HttpWebRequest,并且我从我们奇怪的代理服务器收到 407。 IE、Firefox、Chrome 都设法成功协商代理,Adobe Air 应用程序也是如此。 Google Chrome 网络安装程序实际上失败可能很重要,我们必须使用离线安装程序。
感谢 Ian 的链接,我已经进入了下一阶段。它现在正在向代理发送回 token ,但是第 3 阶段没有通过,因此 .NET 没有发送带有用户名/密码哈希的请求,因此没有返回 HTML。
我正在使用:
- IE6 用户代理
- Windows 7
- Scansafe 代理
- .NET 3.5
这是等同于以下日志的最新代码:
HttpWebRequest request = HttpWebRequest.Create("http://www.yahoo.com") as HttpWebRequest;
IWebProxy proxy = request.Proxy;
// Print the Proxy Url to the console.
if (proxy != null)
{
// Use the default credentials of the logged on user.
proxy.Credentials = CredentialCache.DefaultCredentials;
}
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)";
request.Accept = "*/*";
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
Stream stream = response.GetResponseStream();
异常
WebException (407) Authentication Required.
正在使用的代理
代理客户端是一个Scansafe我们服务器机房中的硬件设备(一旦使用 NTLM 进行身份验证)然后将您的 HTTP 流量定向到其服务器以过滤流量。
System.Net 跟踪输出
IE 成功协商代理
解决方案
我还没有真正找到解决方案,但多亏了 Feroze 和 Eric,我找到了一个解决方法,并发现实际的代理(而不是它的配置)是主要问题。这可能是一个有 3 个变量的模糊问题:.NET HttpWebRequest 的实现、Windows 7,当然还有我们机架中的 Scansafe 硬件客户端;但如果没有 MSDN 支持请求,我将无法找到答案。
最佳答案
如果要为代理设置凭据,难道不应该在 request.Proxy 对象而不是 request 对象上设置凭据吗?
http://msdn.microsoft.com/en-us/library/system.net.webproxy.credentials.aspx
此外,请记住,您需要发出 HTTP/1.1 请求(或者从技术上讲,任何带有 Keep-Alive 的请求)才能成功使用 NTLM/协商身份验证。
(Fiddler 的“Auth”检查器将为您分解 NTLM 身份验证 blob,如果您还没有看的话。)
关于c# - 407 需要身份验证 - 未发送质询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1443617/