Ответ 1
Все это устарело. Последний способ сделать это:
var credentials = new NetworkCredential(userName, password);
var handler = new HttpClientHandler { Credentials = credentials };
using (var http = new HttpClient(handler))
{
// ...
}
Разработал бит HttpClient для создания клиента отдыха. Но я не могу понять и не найти примеров того, как аутентифицироваться на сервере. Скорее всего, я буду использовать базовый aut, но действительно любой пример будет оценен.
В более ранних версиях (с примерами в Интернете) вы сделали:
HttpClient client = new HttpClient("http://localhost:8080/ProductService/");
client.TransportSettings.Credentials =
new System.Net.NetworkCredential("admin", "admin");
Однако свойство TransportSettings
больше не существует в версии 0.3.0.
Все это устарело. Последний способ сделать это:
var credentials = new NetworkCredential(userName, password);
var handler = new HttpClientHandler { Credentials = credentials };
using (var http = new HttpClient(handler))
{
// ...
}
Библиотека HttpClient не попала в .Net 4. Однако она доступна здесь http://nuget.org/List/Packages/HttpClient. Однако аутентификация выполняется по-разному в этой версии HttpClient.
var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization
= new AuthenticationHeaderValue("basic","...");
или
var webRequestHandler = new WebRequestHandler();
CredentialCache creds = new CredentialCache();
creds.Add(new Uri(serverAddress), "basic",
new NetworkCredential("user", "password"));
webRequestHandler.Credentials = creds;
var httpClient = new HttpClient(webRequestHandler);
И будьте осторожны, эта библиотека будет обновляться на следующей неделе, и есть незначительные изменения!
Я попробовал предложение Дункана, но в моем случае это не сработало. Я подозреваю, что это связано с тем, что сервер, с которым я был интегрирован, не отправлял вызов или не запрашивал аутентификацию. Он просто отказался от моих запросов, потому что я не предоставлял заголовок авторизации.
Итак, я сделал следующее:
using (var client = new HttpClient())
{
var encoding = new ASCIIEncoding();
var authHeader = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(encoding.GetBytes(string.Format("{0}:{1}", "username", "password"))));
client.DefaultRequestHeaders.Authorization = authHeader;
// Now, the Authorization header will be sent along with every request, containing the username and password.
}
Обратите внимание, что пример здесь работает только с Базовая проверка подлинности.
Для чего ничего не стоит использовать HttpClientHandler, по крайней мере, не для того, чтобы попытаться выполнить аутентифицированный вызов API CouchDB, для которого требуются учетные данные администратора сервера.
Это сработало для меня:
using( var client = new HttpClient() )
{
var byteArray = Encoding.ASCII.GetBytes("MyUSER:MyPASS");
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
....
}
Как указано в ответе здесь:
Я считаю, что это немного устарело, но для тех, кто ищет обновленный ответ, я использовал этот код, когда я построил свой тестовый сервер:
using (var client = new HttpClient()) { client.BaseAddress = new Uri("http://myServer/api/Person"); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); var byteArray = Encoding.ASCII.GetBytes($"{UserName}:{ApiPassword}"); client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
Или это тоже работает:
using (var http = new HttpClient()) { // byteArray is username:password for the server var byteArray = Encoding.ASCII.GetBytes("myUserName:myPassword"); http.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray)); string uri = "http://myServer/api/people" ; var response = await http.GetStringAsync(uri); List<Person> agencies = JsonConvert.DeserializeObject<List<Person>>(response); foreach (Person person in people) { listBox1.Items.Add(person.Name); } }
Я только что скачал 0.3.0, он действительно был удален. Теперь он на HttpClientChannel
HttpClient client = new HttpClient(...);
var channel = new HttpClientChannel();
channel.Credentials = new NetworkCredential(...);
client.Channel = channel;
Если явно не указано, он использует экземпляр по умолчанию HttpClientChannel
.
UPDATE:, это теперь недействительно для .Net 4.5; см. правильный ответ ниже: fooobar.com/info/179860/...