2009-04-26 10 views
12

Estoy intentando descargar algunos datos de la instancia de servicios de informes en nuestro servidor TFS.
Dado que el código debería ejecutarse en una computadora que no está unida al dominio, calculé que yo mismo establecería las credenciales. Sin suerte, obtuve un HTTP 401 no autorizado de nuevo. Bien, entonces conecté Fiddler para ver qué estaba pasando.System.Net.WebClient falla de forma extraña

Pero fue entonces cuando obtuve Heisenberged - la llamada ahora pasó sin ningún problema. Así que la autenticación se completa con Fiddler conectado, pero falla sin él. ¿Se ha roto el cliente web o me falta algo profundo aquí?

private void ThisWorksWhenDomainJoined() 
    { 
     WebClient wc = new WebClient(); 
     wc.Credentials = CredentialCache.DefaultNetworkCredentials; 
     wc.DownloadString("http://teamfoundationserver/reports/........"); //Works 
    } 

    private void ThisDoesntWork() 
    { 
     WebClient wc = new WebClient(); 
     wc.Credentials = new NetworkCredential("username", "password", "domain"); 
     wc.DownloadString("http://teamfoundationserver/reports/........"); //blows up wih HTTP 401 
    } 
+11

+1 para el uso del principio de Heisenberg uncertaintly como un verbo, no he oído eso antes! –

Respuesta

4

Echa un vistazo a este enlace:
HTTP Authorization and .NET WebRequest, WebClient Classes

que tenían el mismo problema que tú. Solo agregué una línea y comenzó a funcionar. Prueba este

private void ThisDoesntWork() 
    { 
     WebClient wc = new WebClient(); 
     wc.Credentials = new NetworkCredential("username", "password", "domain"); 
     //After adding the headers it started to work ! 
     wc.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"); 
     wc.DownloadString("http://teamfoundationserver/reports/........"); //blows up wih HTTP 401 
    } 
+0

agregar la línea de encabezados funcionó bien para mí! – viperguynaz

1

¿Qué ocurre cuando utiliza esto?

wc.Credentials = CredentialCache.DefaultCredentials; 

Además, ¿está seguro de tener el nombre de usuario, la contraseña y el dominio correctos?

También: Me pregunto si Fiddler está cambiando algunos caracteres Unicode cuando .net los rompe o algo así. Si su usuario/contraseña/dominio tiene unicode, intente eludirlo como "\u2638" en lugar de "☺".

+3

Al resolver un problema similar con un compañero de trabajo, ahora determinamos que el violinista estaba accediendo al servicio web con sus credenciales locales, mientras que el código en una aplicación Asp.Net usaría las credenciales del usuario asp.net, lo que probablemente no t tiene permisos. – travis

2

Prueba esto ...

var credCache = new CredentialCache(); 
credCache.Add(new Uri("http://teamfoundationserver/reports/........""), 
         "Basic", 
         new NetworkCredential("username", "password", "DOMAIN")); 
wc.Credentials = credCache; 

Si eso no funciona, intente reemplazar "básico" con "Negociar".

1

yo era capaz de conseguir alrededor de este error mediante el uso de un objeto CredentialCache, de la siguiente manera:

WebClient wc = new WebClient(); 
CredentialCache credCache = new CredentialCache(); 
credCache.Add(new Uri("http://mydomain.com/"), "Basic", 
new NetworkCredential("username", "password")); 

wc.Credentials = credCache; 

wc.DownloadString(queryString)); 
Cuestiones relacionadas