2009-01-29 21 views
12

Mi caso de uso es esto, quiero llamar a un servicio web y si estoy detrás de un servidor proxy que requiere autenticación solo quiero usar el credenciales predeterminadas ...Cómo determino (elegantemente) si se requiere autenticación de proxy en la aplicación de C# winforms

WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultCredentials; 

de lo contrario, simplemente voy a hacer la llamada, sería muy agradable para determinar si se requiere la autenticación en la delantera, en lugar de controlar la excepción después intento para realizar la llamada.

Ideas?

+0

Solo por curiosidad, si solo está usando las credenciales predeterminadas, ¿cuál sería la desventaja de aplicar estas credenciales todo el tiempo, incluso cuando no sean necesarias? – BFree

+0

en realidad no he intentado con las credenciales predeterminadas, solo con credenciales específicas, la misma clase (DefaultWebProxy) y eso arrojó una excepción, pero buena llamada, lo intentaré con los valores predeterminados cuando llegue a casa del trabajo (espero arrojar la misma excepción) –

Respuesta

4

System.Net.WebProxy tiene una propiedad llamada UseDefaultCredentials que puede ser lo que quiere (pero tengo que admitir un poco de la ignorancia aquí). El enlace a la documentación relevante es here.

+0

Creo que esto probablemente también funcione, de hecho es básicamente lo mismo que el anterior. Gracias. –

13

Fue solo después de que implementé por primera vez mi app que me di cuenta de que algunos usuarios estaban detrás de los firewalls ... se pusieron a trabajar para probarlo. En lugar de hacer una prueba para un '407 autenticación requerida' acabo de hacer la misma configuración Proxy si podría ser necesario o no ...

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 

No estoy seguro de lo que las ventajas relativas/desventajas son (tratan {} catch {} sin proxy primero, en lugar de usar el anterior), pero este código ahora parece funcionar para mí tanto en el trabajo (proxy de autenticación) como en el hogar (ninguno).

+0

No creo que el indicador PreAuthenticate aquí se requiera específicamente, esto solo hace que la solicitud se autentique inmediatamente después de la primera solicitud al servidor web si las credenciales están configuradas –

-1

Parece que si deja las cosas proxy solo, .NET should just use the IE proxy settings, que parece ser la forma más "correcta" de tratar con los proxies ...

+1

no, no puede ignorarlo, lo que definitivamente causa una excepción. –

+0

Acabo de probar esto y no encontré problemas. Creo que este es un enfoque válido. –

+2

Esto no funciona si el proxy requiere una autenticación –

0

Si desea comprobar la configuración del proxy en Internet Explorer, se también podría echar un vistazo al registro: verifique la rama HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings del árbol de registro, donde hay muchas opciones y configuraciones. En particular: ProxyEnable (un DWORD, 0 = sin proxy, 1 = proxy habilitado).

1

En realidad, parece que esto no es un problema, después de todo, yo estaba sentado Anteriormente la autenticación así ...

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

Esto estaría bien para cuando yo estaba detrás del proxy, pero generará un error cuando no había proxy, entonces, por supuesto, esperaba el mismo error antes, ya que solo estaba estableciendo las mismas credenciales, pero ya sabes lo que dicen sobre asumir cosas ... de hecho, no hay ningún error al configurar el valor predeterminado creds, todo es dulce.

0

Le recomiendo encarecidamente que pruebe this answer a una pregunta similar (no: no es la respuesta aceptada). No cambia el código, solo una línea en su archivo app.config.

Cuestiones relacionadas