Как использовать учетные данные в HttpClient в С#?

Я сталкиваюсь с некоторыми проблемами при использовании класса HttpClient для доступа к Delicious API. У меня есть следующий код:

try
{
    const string uriSources = "https://api.del.icio.us/v1/tags/bundles/all?private={myKey}";
    using (var handler = new HttpClientHandler { Credentials = new  
                             NetworkCredential("MyUSER", "MyPASS") })
    {
         using (var client = new HttpClient(handler))
         {
             var result = await client.GetStringAsync(uriSources);
         }
   }
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message, "ERROR...", MessageBoxButton.OK);
}

При запуске приведенного выше кода я получаю следующее: Код состояния ответа не указывает на успех: 401 (неавторизованный).

Итак, как я мог получить эту работу? Является ли это возможным?

заранее спасибо

С Уважением!


person MikePR    schedule 28.08.2013    source источник
comment
401 Неавторизованный означает неправильное имя пользователя или пароль...   -  person Raptor    schedule 28.08.2013
comment
Я знаю, однако я использую правильные ;-)   -  person MikePR    schedule 28.08.2013
comment
Когда я помещаю вышеуказанный URL-адрес в любой браузер, он запрашивает учетные данные (то же самое, что я использую в коде), и это работает. Итак, я думаю, это связано с тем, как httpClient запрашивает данные   -  person MikePR    schedule 28.08.2013
comment
Это может показаться глупым вопросом, но на самом деле вы используете свой закрытый ключ вместо {myKey} и просто поместили его туда для демонстрации, верно?   -  person Melvin DVaz    schedule 28.08.2013
comment
Верно. Я поставил его только для демонстрации, а также имя пользователя и пароль. Я использую хорошие в своей песочнице ;-)   -  person MikePR    schedule 28.08.2013
comment
Возможно ли, что вам нужно указать домен для ваших сетевых учетных данных? Это единственное, что я могу придумать для ошибки авторизации, когда ваши данные для входа верны :(   -  person Melvin DVaz    schedule 28.08.2013
comment
Может быть, странно отвечать на это, но ... иногда у меня такое поведение, и на самом деле я потерял подключение к Интернету в своем эмуляторе WP. Попробуйте запустить IE.   -  person Fabrice    schedule 28.08.2013
comment
Пробовали ли вы использовать HttpWebRequest, blog.karlbunyan.com/2007/02/11/   -  person Erwin    schedule 28.08.2013
comment
Привет Эрвин. У меня не было времени, чтобы проверить ваше предложение до сих пор. и он работает нормально для меня. Единственная проблема заключается в том, что HttpWebRequest выполняется в том же потоке пользовательского интерфейса. Но мне это нужно только для получения нескольких данных. Так что, я думаю, это будет хорошо. Спасибо ;-)   -  person MikePR    schedule 30.08.2013


Ответы (3)


У меня была точно такая же проблема. Кажется, что HttpClient просто игнорирует учетные данные, установленные в файле HttpClientHandler.

Однако следующее должно работать:

using System.Net.Http.Headers; // For AuthenticationHeaderValue

const string uri = "https://example.com/path?params=1";
using (var client = new HttpClient()) {
    var byteArray = Encoding.ASCII.GetBytes("MyUSER:MyPASS");
    var header = new AuthenticationHeaderValue(
               "Basic", Convert.ToBase64String(byteArray));
    client.DefaultRequestHeaders.Authorization = header;

    var result = await client.GetStringAsync(uri);
}

Обработчик не нужен.

Источник: http://www.snip2code.com/Snippet/13895/Simple-C---NET-4-5-HTTPClient-Request-Us

person Adam Szabo    schedule 28.05.2014
comment
Это решение работает хорошо, поскольку оно позволяет установить заголовок авторизации при первом запросе, тем самым минуя 401 вызов/ответ. Однако, по моему опыту работы с HttpClient и HttpClientHandler, настройка предварительной аутентификации работает, поскольку заголовок Authorize устанавливается для каждого запроса после завершения запроса/ответа 401. Эта статья хорошо объясняет это: weblog.west-wind.com/posts/2010/Feb/18/ - person Philippe; 24.09.2014
comment
@Adam Szabo это кажется первоисточником - person superjos; 05.08.2015

Это старый пост, но я решил добавить свой ответ для тех, кто сталкивается с подобной проблемой и просматривает ответы...

Я столкнулся с подобной проблемой. В моем случае сработала установка свойства Domain для NetworkCredentials. Вы можете попробовать установить домен.

person Nirav Darji    schedule 05.10.2015

Код, который вы показываете, работает для меня с аутентифицированным ресурсом. Я подозреваю, что Delicious делает что-то странное.

Учитывая, что вы используете Windows Phone, отлаживать с помощью Fiddler очень сложно, поэтому я предлагаю приобрести Runscope. Счет. Установите этот обработчик сообщений, который будет перенаправлять ваш запрос через отладчик RunScope. Как только вы это сделаете, я предлагаю вам взглянуть на заголовок www-authenticate и изучить, что он возвращает.

Если ничего не помогает, вы всегда можете установить заголовок Authentication напрямую с базовыми учетными данными аутентификации. Вам не нужно использовать класс Credentials.

person Darrel Miller    schedule 31.08.2013
comment
У меня есть похожая проблема, опубликованная здесь на случай, если у вас будет возможность предложить/ваши мысли и т. д. - person nam; 11.10.2020