2010-01-27 16 views
30

Mam następujący kod uruchomiony w usłudze Windows:WebClient generuje (401) błędzie Nieuprawnione

WebClient webClient = new WebClient(); 
webClient.Credentials = new NetworkCredential("me", "12345", "evilcorp.com"); 
webClient.DownloadFile(downloadUrl, filePath); 

Za każdym razem otrzymuję następujący wyjątek

{"The remote server returned an error: (401) Unauthorized."} 

z następującymi wewnętrzny wyjątek:

{"The function requested is not supported"} 

Wiem na pewno, że poświadczenia są ważne, jeśli przejdę do downloadUrl w moich przeglądarkach internetowych er i wpisz moje dane uwierzytelniające jako evilcorp.com \ me z hasłem 12345, to ładuje się dobrze.

Co jest dziwne, ale jeśli podam moje dane uwierzytelniające jako [email protected] z 12345, wygląda na to, że nie.

Czy istnieje sposób na sformatowanie poświadczeń?

+0

Czy kiedykolwiek wymyśliłeś rozwiązanie (kod) dla tego problemu? – Crash893

Odpowiedz

6

Wygląda na to, że system operacyjny, na którym działasz, zmienia się domyślnie w systemie operacyjnym. Ten blog ma więcej szczegółów: http://ferozedaud.blogspot.com/2009/10/ntlm-auth-fails-with.html

to najwyraźniej również omawiane na stackoverflow tutaj: 407 Authentication required - no challenge sent

Proponuję najpierw przeczytać blog jako wiedza destylowana ma.

+3

..... lub możesz po prostu spojrzeć na odpowiedź Briana tuż poniżej – FastTrack

2

Zgodnie z msdn docs wyjątek może być spowodowany tym, że metoda została wywołana jednocześnie na wielu wątkach. Metoda wymaga również całkowicie kwalifikowanego adresu URL, takiego jak http://evilcorp.com/.

68

webClient.UseDefaultCredentials = true; Rozwiązałem mój problem.

+0

Większość przypadków wymaga tego ustawienia, że ​​serwer musi uzyskać informacje identyfikujące użytkownika, takie jak witryna ASP.Net, która konfiguruje uwierzytelnianie systemu Windows. – lzlstyle

+4

Brian, jeśli byłeś bliżej, przysięgam, że pocałowałbym cię teraz !! Walczyłem z tym przez wiele godzin i przegapiłem tylko to ustawienie !? :-o dzięki!! – KDT

+1

Zdecydowanie też mi pomogło. Dziękuję Brian – FastTrack

0

Podczas pisania adresu URL, umieść znak "@" przed łańcuchem adresu URL.

Na przykład:

var url = @"http://evilcorp.com"; 
WebClient webClient = new WebClient(); 
webClient.Proxy = null; 
webClient.DownloadFile(new Uri(url), filePath); 

to rozwiąże problem.

Odpowiedź podana przez P.Brian.Mackey jest również poprawna.

+4

Dla podanego adresu URL znak @ nie robi żadnej różnicy. – Dughall