如果您的标头通常相同,那么您可以设置DefaultRequestHeaders
。但您不需要使用该属性来指定标头。正如您所确定的,如果您要使用同一客户端有多个线程,那么这是行不通的。在一个线程上对默认标头进行的更改会影响在其他线程上发送的请求。
尽管您可以在客户端上设置默认标头并将其应用到每个请求,但标头实际上是请求的属性。因此,当标头特定于请求时,您只需将它们添加到请求中即可。
request.Headers.Authorization = new AuthenticationHeaderValue("bearer", bearerToken);
这意味着您不能使用不涉及创建的简化方法HttpRequest
。你需要使用
public Task<HttpResponseMessage> SendAsync(HttpRequestMessage request)
有记录的here https://msdn.microsoft.com/en-us/library/hh138176(v=vs.118).aspx.
有些人发现使用扩展方法将更新标头的代码与方法的其余部分隔离是很有帮助的。
通过扩展方法完成的 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));