System.Net.WebClient терпит неудачу
Я пытаюсь загрузить некоторые данные из экземпляра служб отчетов на нашем сервере TFS.
Учитывая, что код должен работать на компьютере, который не подключен к домену, я решил, что сам установил учетные данные. Не повезло, получил HTTP 401 Unauthorized назад. Хорошо, поэтому я подключил Fiddler, чтобы посмотреть, что происходит.
Но когда я получил Heisenberged - звонок теперь прошел без заминки. Таким образом, аутентификация проходит через подключенный Fiddler, но без него. Является ли Webclient сломанным или я что-то не хватает здесь?
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
}
Ответы
Ответ 1
Взгляните на эту ссылку:
HTTP-авторизация и .NET WebRequest, классы WebClient
У меня была такая же проблема, как и вы. Я добавил только одну строку, и она начала работать. Попробуйте это
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
}
Ответ 2
Попробуйте это...
var credCache = new CredentialCache();
credCache.Add(new Uri("http://teamfoundationserver/reports/........""),
"Basic",
new NetworkCredential("username", "password", "DOMAIN"));
wc.Credentials = credCache;
Если это не сработает, попробуйте заменить "Basic" на "Negotiate".
Ответ 3
Что происходит, когда вы используете это?
wc.Credentials = CredentialCache.DefaultCredentials;
Кроме того, вы уверены, что у вас есть правильное имя пользователя, пароль и домен?
Также: Интересно, меняется ли Fiddler вокруг некоторых символов Unicode, когда .net ломает их или что-то в этом роде. Если ваш пользователь/пароль/домен имеет юникод, попробуйте выполнить его как "\u2638"
вместо "☺"
.
Ответ 4
Мне удалось обойти эту ошибку, используя объект CredentialCache, следующим образом:
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));