如何(优雅地)确定C#winforms应用程序中是否需要代理身份validation

我的用例是这样的,我想呼叫一个web服务,如果我在需要身份validation的代理服务器后面,我想只使用默认凭据…

WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultCredentials; 

否则我只是简单地拨打电话,确定是否需要预先validationauth是非常好的,而不是在我尝试拨打电话后处理exception。

想法?

System.Net.WebProxy有一个名为UseDefaultCredentials的属性, 可能就是你想要的(但我必须承认这里有点无知)。 这里有相关文档的链接。

只是在我第一次部署我的应用程序之后 ,我意识到有些用户在防火墙之后……正在努力测试它。 而不是测试“407所需的身份validation”我只是做同样的Proxy设置,无论是否需要…

 System.Net.HttpWebRequest req = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(uri.AbsoluteUri); //HACK: add proxy IWebProxy proxy = WebRequest.GetSystemWebProxy(); proxy.Credentials = System.Net.CredentialCache.DefaultCredentials; req.Proxy = proxy; req.PreAuthenticate = true; //HACK: end add proxy req.AllowAutoRedirect = true; req.MaximumAutomaticRedirections = 3; req.UserAgent = "Mozilla/6.0 (MSIE 6.0; Windows NT 5.1; DeepZoomPublisher.com)"; req.KeepAlive = true; req.Timeout = 3 * 1000; // 3 seconds 

我不确定相对的优点/缺点是什么(try {} catch {}没有代理,而不仅仅是使用上面的代码,但这个代码现在似乎对我工作(validation代理)和在家里都有用(没有)。

实际上,似乎这毕竟不是问题,以前我是这样设置的…

  WebProxy proxy = new WebProxy(@"http://:8080"); proxy.Credentials = new NetworkCredential(, , ); WebRequest.DefaultWebProxy = proxy; 

当我在代理后面但在没有代理时抛出错误就好了,所以我当然希望上面的错误与我仍然只是设置相同的凭据一样,但你知道他们对于假设的事情。 …事实上,设置默认信用卡完全没有错误,一切都很好。

如果要在IE中检查代理设置,还可以查看注册表:检查注册表树的HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings分支 – 那里有很多选项和设置。 最值得注意的是: ProxyEnable (DWORD,0 =无代理,1 =启用代理)。

我强烈建议你尝试这个类似问题的答案 (不是:不是接受的答案)。 没有代码更改,只是app.config文件中的一行。

看起来如果你单独留下Proxy的东西, .NET应该只使用IE代理设置 ,这似乎是处理代理的最“正确”的方式……