2009-04-26 4 views
12

Sto cercando di scaricare alcuni dati dall'istanza dei servizi di report sul nostro server TFS.
Dato che il codice deve essere eseguito su un computer non appartenente al dominio, ho pensato che avrei impostato personalmente le credenziali. Nessuna fortuna, ha ottenuto un HTTP 401 indietro non autorizzato. Ok, ho collegato Fiddler per vedere cosa stava succedendo.System.Net.WebClient non funziona in modo strano

Ma questo è quando ho ottenuto Heisenberged - la chiamata ora è andata avanti senza intoppi. Quindi l'autenticazione passa con Fiddler connesso, ma fallisce senza di esso. Il client Web è rotto o mi manca qualcosa di profondo qui?

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 per l'utilizzo del principio di Heisenberg uncertaintly come un verbo, mai sentito che uno prima! –

risposta

4

Date un'occhiata a questo link:
HTTP Authorization and .NET WebRequest, WebClient Classes

Ho avuto lo stesso problema come voi. Ho solo aggiunto una riga e ha iniziato a funzionare. Prova questo

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

aggiungendo la linea di intestazioni ha funzionato bene per me! – viperguynaz

1

Cosa succede quando si utilizza questo?

wc.Credentials = CredentialCache.DefaultCredentials; 

Inoltre, sei sicuro di avere il nome utente, la password e il dominio corretti?

Inoltre: Mi chiedo se Fiddler stia modificando alcuni caratteri unicode quando .net li interrompe o qualcosa del genere. Se il tuo utente/pass/dominio ha unicode, prova a eseguire l'escape come "\u2638" anziché "☺".

+3

Al momento di risolvere un problema simile con un collaboratore, abbiamo determinato che il violinista stava accedendo al servizio web con le credenziali locali, mentre il codice in un'app Asp.Net utilizzava le credenziali dell'utente asp.net, che molto probabilmente non lo sono t hanno i permessi. – travis

2

Prova questo ...

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

Se questo non funziona, provare a sostituire "Basic" con "negoziare".

1

sono stato in grado di aggirare questo errore utilizzando un oggetto CredentialCache, come segue:

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));