Ответ 1
Если ваши заголовки обычно будут одинаковыми, вы можете установить DefaultRequestHeaders
. Но вам не нужно использовать это свойство для указания заголовков. Как вы определили, это просто не сработает, если у вас будет несколько потоков с использованием одного и того же клиента. Изменения в заголовках по умолчанию, сделанные в одном потоке, будут влиять на запросы, отправленные на другие потоки.
Хотя вы можете устанавливать заголовки по умолчанию на клиенте и применять их к каждому запросу, заголовки действительно являются свойствами запроса. Поэтому, когда заголовки специфичны для запроса, вы просто добавляете их в запрос.
request.Headers.Authorization = new AuthenticationHeaderValue("bearer", bearerToken);
Это означает, что вы не можете использовать упрощенные методы, которые не связаны с созданием HttpRequest
. Вам нужно будет использовать
public Task<HttpResponseMessage> SendAsync(HttpRequestMessage request)
documented здесь.
Пример методов GET и POST, выполненных с помощью метода расширения, который позволяет вам манипулировать заголовком запроса и более HttpRequestMessage
перед его отправкой:
public static Task<HttpResponseMessage> GetAsync
(this HttpClient httpClient, string uri, Action<HttpRequestMessage> preAction)
{
var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, uri);
preAction(httpRequestMessage);
return httpClient.SendAsync(httpRequestMessage);
}
public static Task<HttpResponseMessage> PostAsJsonAsync<T>
(this HttpClient httpClient, string uri, T value, Action<HttpRequestMessage> preAction)
{
var httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, uri)
{
Content = new ObjectContent<T>
(value, new JsonMediaTypeFormatter(), (MediaTypeHeaderValue)null)
};
preAction(httpRequestMessage);
return httpClient.SendAsync(httpRequestMessage);
}
Затем они могут быть использованы следующим образом:
var response = await httpClient.GetAsync("token",
x => x.Headers.Authorization = new AuthenticationHeaderValue("basic", clientSecret));