如果您的标题通常是相同的,那么您可以设置DefaultRequestHeaders
.但是您不需要使用该属性来指定标头.正如您已经确定的那样,如果您要让多个线程使用同一客户端,那么这将不起作用.对一个线程上的默认标头所做的更改会影响其他线程上发送的请求.
虽然您可以在客户端设置默认标头并将其应用于每个请求,但标头实际上是请求的属性.因此,当标头特定于请求时,您只需将它们添加到请求即可.
request.Headers.Authorization = new AuthenticationHeaderValue("bearer", bearerToken);
这意味着你不能使用不涉及创建HttpRequest
的简化方法.你需要使用
public Task<HttpResponseMessage> SendAsync(HttpRequestMessage request)
记录了here个.
一些人发现,使用扩展方法将更新头的代码与方法的其余部分隔离开来是很有帮助的.
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));