2017-02-15 3 views
1

У меня есть HttpClient, что является общим для нескольких потоков:Как установить HTTPHeader по индивидуальному заказу с использованием HttpClient

public static class Connection 
{ 
    public static HttpClient Client { get; } 

    static Connection() 
    { 
     Client = new HttpClient 
     { 
      BaseAddress = new Uri(Config.APIUri) 
     }; 

     Client.DefaultRequestHeaders.Add("Connection", "Keep-Alive"); 
     Client.DefaultRequestHeaders.Add("Keep-Alive", "timeout=600"); 
     Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
    } 
} 

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

var client = Connection.Client; 
StringContent httpContent = new StringContent(myQueueItem, Encoding.UTF8, "application/json"); 

httpContent.Headers.Add("Authorization", "Bearer " + accessToken); // <-- Header for this and only this request 
HttpResponseMessage response = await client.PostAsync("/api/devices/data", httpContent); 
response.EnsureSuccessStatusCode(); 

string json = await response.Content.ReadAsStringAsync(); 

Когда я делаю это, я получаю исключение:

{ "злоупотреблянный имя заголовка. Убедитесь, что заголовки запроса используются с HttpRequestMessage, заголовки ответа с HttpResponseMessage и заголовки содержимого с HttpContent объектов. "}

Я не смог найти другой способ добавить заголовки запросов к этому запросу. Если я изменил DefaultRequestHeaders на Client, я столкнулся с проблемами потоков и должен был реализовать всевозможные сумасшедшие блокировки.

Любые идеи?

ответ

1

Вы можете использовать SendAsync, чтобы отправить HttpRequestMessage.

В сообщении вы можете установить uri, method, content и headers.

Пример:

HttpRequestMessage msg = new HttpRequestMessage(HttpMethod.Post, "/api/devices/data"); 
msg.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); 
msg.Content = new StringContent(myQueueItem, Encoding.UTF8, "application/json"); 

HttpResponseMessage response = await client.SendAsync(msg); 
response.EnsureSuccessStatusCode(); 

string json = await response.Content.ReadAsStringAsync(); 
+1

Awesome! Это работает. Я также добавил свой рабочий код к вашему ответу. '+ 1' –

Смежные вопросы