8

我能够解决客户端无法通过代理进行身份验证的问题,执行以下操作:

    var proxy = WebRequest.GetSystemWebProxy();
    proxy.Credentials = CredentialCache.DefaultNetworkCredentials;
    service.Proxy = proxy;

这适用于 Windows XP,但是在 Windows 7 上我得到一个 407(代理未经过身份验证的异常)。有谁知道有什么区别,更重要的是,我需要做什么才能让它在两个操作系统上工作?

更新

我让用户检查以下内容:

  1. 在注册表编辑器中,您可以转到 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon 并让我知道 CachedLogonsCount 的值是多少。F
  2. 在开始框中,输入组策略,然后会弹出一个编辑组策略的选项,单击它。然后转到计算机配置\管理模板\系统\用户配置文件\删除漫游配置文件的缓存副本,让我知道它是否已配置,如果是,它设置了什么?

赏金更新

所以,我添加了赏金。我可以从这里采取解决方案,或者只是通过 Windows 7 上的代理的替代方法......

另一个更新

我不确定这是否有用,但我们也在做以下事情:

service.PreAuthenticate = true;
service.Url = "myurl";
service.Credentials = new NetworkCredential(txt_UserName.Text, txt_Password.Text);

我的临时解决方案

这不是一个真正的解决方案,但现在有效。我正在使用 app.config 并将代理设置为默认值,并使用 ByPassList 以便甚至不使用代理。这只是可行的,因为代理目前没有强大的防火墙。对于其他客户,我需要让上述工作

4

4 回答 4

2

实际上看起来他们在 Win7 中“修复”了它 :) 你能确认客户端和服务器都指定了 http 1.1

现在让我们讨论一下为什么浏览器会在这种情况下工作。IE 在后台使用 WinINet 而不是 WinHTTP。如果我们查看网络跟踪,我们会看到 IE 发送 HTTP/1.1,但代理以 HTTP/1.0 回复。IE 仍然接受这种行为,因为在互联网场景中有无数的客户端和服务器仍然使用 HTTP/1.0。

WinHTTP 严格要求符合 HTTP/1.1 以保持连接处于活动状态,并且 HTTP/1.0 协议不支持 HTTP Keep-Alives。HTTP Keep-Alive 功能是根据 RFC 2616 在 HTTP/1.1 协议中引入的。期望 keep-alive 的服务器或代理也应该正确实现该协议。Windows 7、Windows 2008 R2 上的 WinHTTP 在安全性 wrto 协议合规性方面非常严格。理想的解决方案是更改服务器/代理以使用正确的协议并符合 RFC。

http://blogs.msdn.com/b/httpcontext/archive/2012/02/21/changes-in-winhttp-on-windows-7-and-onwards-wrto-http-1-0.aspx

于 2012-10-31T03:33:24.377 回答
2

这段代码适用于 XP、Win7 和 2008

var webProxy = new WebProxy(WebRequest.DefaultWebProxy.GetProxy(new Uri({TheURLoftheService})));
webProxy.Credentials = CredentialCache.DefaultCredentials;
webProxy.UseDefaultCredentials = true;
service.Proxy = webProxy;
于 2012-10-26T01:45:35.590 回答
0

这行得通吗?

我正在使用它来设置代理,到目前为止我们在所有windows平台上都没有遇到错误

Uri address = new Uri("http://your-webservice-address");

//Get User current network credential
ICredentials credentials = CredentialCache.DefaultCredentials;
NetworkCredential credential = credentials.GetCredential(address, "Basic");

//Get HttpWebRequest
HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest;

//Network Credential should be included on the request to avoid network issues when requesting to the web servic
request.Proxy = WebRequest.DefaultWebProxy;
request.Credentials = new NetworkCredential(credential.UserName, credential.Password, credential.Domain);
于 2012-10-31T20:44:23.407 回答
0

根据您提供的代码很难说。我怀疑它是您的 IE 设置或您的代理变量。

检查http://social.msdn.microsoft.com/Forums/en/netfxnetcom/thread/61b71194-1758-4c7b-89fe-91be7363db13可能会有所帮助。

于 2012-10-31T21:27:00.943 回答