Вопрос по c# – Заголовок аутентификации HttpClient не отправляется

20

Я пытаюсь использоватьHttpClient для сторонней службы, которая требует базовой проверки подлинности HTTP. Я используюAuthenticationHeaderValue, Вот что я придумала до сих пор:

<code>HttpRequestMessage<RequestType> request = 
    new HttpRequestMessage<RequestType>(
        new RequestType("third-party-vendor-action"),
        MediaTypeHeaderValue.Parse("application/xml"));
request.Headers.Authorization = new AuthenticationHeaderValue(
    "Basic", Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(
        string.Format("{0}:{1}", "username", "password"))));

var task = client.PostAsync(Uri, request.Content);
ResponseType response = task.ContinueWith(
    t =>
    {
        return t.Result.Content.ReadAsAsync<ResponseType>();
    }).Unwrap().Result;
</code>

Похоже, что действие POST работает нормально, но я не получаю ожидаемых данных. Путем проб и ошибок и, в конечном итоге, используя Fiddler для перехвата необработанного трафика, я обнаружил, что заголовок авторизации не отправляется.

Я виделэтот, но я думаю, что у меня есть схема аутентификации, указанная как частьAuthenticationHeaderValue конструктор.

Я что-то пропустил?

Ваш Ответ

4   ответа
4

На самом деле ваша проблема сPostAsync- вы должны использоватьSendAsync, В вашем коде -client.PostAsync(Uri, request.Content); отправляет только контент, в который заголовки сообщения запроса не включены. Правильный способ это:

HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Post, url)
{
    Content = content
};
message.Headers.Authorization = new AuthenticationHeaderValue("Basic", credentials);
httpClient.SendAsync(message);
Тысячу раз спасибо. Я потратил часы, пытаясь присоединить заголовки к HttpClient и используя GetAsync, PostAsync и т. Д., И в целом я испытываю затруднения с WebAPI (дайте мне ServiceStack !!)
Спасибо! Я собираюсь попробовать это, чтобы исправить мои ошибки с общим httpclient в большом приложении.
28

как будто он должен работать - я помню, что сталкивался с подобной проблемой установки заголовков авторизации и решил ее, выполнив Headers.Add () вместо установки:

request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(string.Format("{0}:{1}", "username", "password"))));

UPDATE: Похоже, когда вы делаете request.Content, не все заголовки отражаются в объекте содержимого. Вы можете убедиться в этом, проверив request.Headers и request.Content.Headers. Одна вещь, которую вы можете попробовать, это использовать SendAsync вместо PostAsync. Например:

HttpRequestMessage<RequestType> request = 
     new HttpRequestMessage<RequestType>(
         new RequestType("third-party-vendor-action"),
         MediaTypeHeaderValue.Parse("application/xml"));

request.Headers.Authorization = 
    new AuthenticationHeaderValue(
        "Basic", 
        Convert.ToBase64String(
            System.Text.ASCIIEncoding.ASCII.GetBytes(
                string.Format("{0}:{1}", "username", "password"))));

 request.Method = HttpMethod.Post;
 request.RequestUri = Uri;
 var task = client.SendAsync(request);

 ResponseType response = task.ContinueWith(
     t => 
         { return t.Result.Content.ReadAsAsync<ResponseType>(); })
         .Unwrap().Result;
К сожалению, ни один из вариантов здесь не работает для меня
Ваше обновление, по крайней мере, отправляет заголовок авторизации. Я пока не могу получить данные из сторонней службы (возможно, что-то еще не так в теле запроса, которое я пропустил), но по крайней мере правильные заголовки передаются по проводам. Это начало. Спасибо! Ross
Я пробовал это и что-то подобное сrequest.Headers.Authorization с такими же результатами. Из-за этого у меня немного разболелась голова, потому что я не совсем уверен, что делать дальше. Я знаю, что бета-версия MVC4 и предварительный просмотр версии 4.5 несовместимы с некоторыми вещами - интересно, это как-то связано с этим? Ross
ASCII или UTF-8? Увидетьstackoverflow.com/questions/11743160/….
18

и вам не придется иметь дело с преобразованиями строк base64:

var handler = new HttpClientHandler();
handler.Credentials = new System.Net.NetworkCredential("username", "password");
var client = new HttpClient(handler);
...
гораздо более чистое решение, чем кодирование комбинации UID: PWD.
17

DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes(String.Format("{0}:{1}", userName, password))));

Это работает для меня.

Это, вероятно, сработает, но установит заголовки авторизации для всех запросов, не так ли? Это нежелательно. Ross
Для всех запросов, сделанных с этим экземпляром клиента, да. Используете ли вы один и тот же клиент для доступа к конечным точкам с разными схемами аутентификации? Т.е. вы устанавливаете BaseAddress на клиентском экземпляре или нет?

Похожие вопросы