How do I determine (elegantly) if proxy authentica

2019-02-01 23:49发布

My use case is this, I want to call out to a webservice and if I am behind a proxy server that requires authentication I want to just use the default credentials...

  WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultCredentials;

Otherwise I'll just simply make the call, It would be very nice to determine if the auth is required up front, rather than handle the exception after I attempt to make the call.

Ideas?

6条回答
对你真心纯属浪费
2楼-- · 2019-02-02 00:22

Actually, seems that this isn't an issue after all, Previously I was setting the auth like so...

  WebProxy proxy = new WebProxy(@"http://<myProxyAddress>:8080");
  proxy.Credentials = new NetworkCredential(<myUSerName>, <myPassword>, <myDomain>);
  WebRequest.DefaultWebProxy = proxy;

This would be fine for when I was behind the proxy but throw an error when there was no proxy, so of course I expected the same error above as I was still just setting the same credentials, but you know what they say about assuming things....in fact there is no error at all with setting the default creds, all is sweet.

查看更多
疯言疯语
3楼-- · 2019-02-02 00:31

It looks like if you leave the Proxy stuff alone, .NET should just use the IE proxy settings, which seems like the most "correct" way of dealing with proxies...

查看更多
手持菜刀,她持情操
4楼-- · 2019-02-02 00:32

System.Net.WebProxy has a property called UseDefaultCredentials that may be what you want (but I have to admit a bit of ignorance here). The link to the relevant documentation is here.

查看更多
Bombasti
5楼-- · 2019-02-02 00:32

I strongly urge you to try this answer to a similar question (not: not the accepted answer). No code changes, just a line in your app.config file.

查看更多
Ridiculous、
6楼-- · 2019-02-02 00:39

It was only after I had first deployed my app that I realised some users were behind firewalls... off to work to test it. Rather than do a test for a '407 authentication required' I just do the same Proxy setup whether it might be needed or not...

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

I'm not sure what the relative advantages/disadvantages are (try{}catch{} without proxy first, versus just using the above), but this code now seems to work for me both at work (authenticating proxy) and at home (none).

查看更多
Deceive 欺骗
7楼-- · 2019-02-02 00:42

If you want to check for the Proxy settings in IE, you could also peek into the registry: check the HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings branch of the registry tree - lots of options and settings there. Most notably: ProxyEnable (a DWORD, 0 = no proxy, 1 = proxy enabled).

查看更多
登录 后发表回答