2009-04-26 6 views
12

Ich versuche, einige Daten von der Reporting Services-Instanz auf unserem TFS-Server herunterladen.
Da der Code auf einem Computer ausgeführt werden sollte, der nicht mit einer Domäne verbunden ist, dachte ich, dass ich die Anmeldeinformationen selbst festlegen würde. Kein Glück, habe eine HTTP 401 Unauthorized zurück. Ok, also habe ich Fiddler angeschlossen um zu sehen was passiert ist.System.Net.WebClient schlägt seltsam

Aber das war, als ich Heisenberged bekam - der Anruf ging jetzt ohne Probleme durch. Die Authentifizierung läuft also mit Fiddler verbunden, scheitert aber ohne sie. Ist der Webclient kaputt oder fehlt mir hier etwas Tiefgründiges?

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 für die Verwendung des Heisen uncertaintly Prinzip als Verb, nie vor, dass man gehört haben! –

Antwort

4

Werfen Sie einen Blick auf diesen Link:
HTTP Authorization and .NET WebRequest, WebClient Classes

ich das gleiche Problem wie Sie hatten. Ich habe nur eine Zeile hinzugefügt und es hat angefangen zu arbeiten. Versuchen Sie, diese

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

Hinzufügen der Header-Linie hat gut für mich gearbeitet! – viperguynaz

1

Was passiert, wenn Sie dieses verwenden?

wc.Credentials = CredentialCache.DefaultCredentials; 

Sind Sie auch sicher, dass Sie den richtigen Benutzernamen, Passwort und Domain haben?

Auch: Ich frage mich, ob Fiddler ändert sich um einige Unicode-Zeichen, wenn .net bricht sie oder so ähnlich. Wenn Ihr Benutzer/pass/domain Unicode hat, versuchen Sie es wie "\u2638" statt "☺" zu umgehen.

+3

Bei der gleichzeitigen Bearbeitung eines ähnlichen Problems mit einem Mitarbeiter haben wir festgestellt, dass fiddler mit Ihren lokalen Zugangsdaten auf den Web-Service zugreift, wobei der Code in einer Asp.Net-App die Anmeldedaten des asp.net-Benutzers verwendet. t haben Berechtigungen. – travis

2

Try this ...

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

Wenn das nicht funktioniert, versuchen "Basic" mit "Verhandeln" zu ersetzen.

1

ich in der Lage war, um diesen Fehler zu erhalten, indem ein CredentialCache Objekt wie folgt verwendet:

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