在决定如何为HttpClient分配Headers时,请考虑Headers是否对每个请求都相同,尤其是如果HttpClient实例在所有线程之间共享。
如果Headers始终相同,则可以使用DefaultRequestHeaders,并且只需要分配一次。
对DefaultRequestHeaders进行的任何更改都将影响访问该实例的所有线程。
下面的示例适用于.NET Core和.NET 7:
using System.Linq;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
if (!_httpClient.DefaultRequestHeaders.Contains("key"))
{
_httpClient.DefaultRequestHeaders.Add("key", "value");
}
var headerValue = string.Empty;
if (_httpClient.DefaultRequestHeaders.Contains("key"))
{
headerValue = _httpClient.DefaultRequestHeaders.GetValues("key").First();
}
var response = await _httpClient.GetAsync("path");
var returnValue = string.Empty;
if (response.IsSuccessStatusCode)
{
returnValue = await response.Content.ReadAsStringAsync();
}
然而,如果每个消息的标题都预计会更改,则应该在初始化每个新请求时设置一个HttpRequestMessage实例,并使用所需的值。
using System.Linq;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
_httpClient = new HttpClient();
_httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
_httpClient.BaseAddress = new Uri("https://example.com/");
var headersDictionary = new Dictionary<string, string>()
{
{"key1", "value1"},
{"key2", "value2"}
};
var httpRequestMessageObject = new HttpRequestMessage(HttpMethod.Get, "relativePath");
var body = "content";
httpRequestMessageObject.Content = new StringContent(body, Encoding.UTF8, "application/json");
foreach (var header in headersDictionary)
{
if (!httpRequestMessageObject.Headers.Contains(header.Key))
{
httpRequestMessageObject.Headers.Add(header.Key, header.Value);
}
}
var headerValue = string.Empty;
if (httpRequestMessageObject.Headers.Contains("key"))
{
headerValue = httpRequestMessageObject.Headers.GetValues("key").First();
}
var response = await _httpClient.SendAsync(httpRequestMessageObject);
var returnValue = string.Empty;
if (response.IsSuccessStatusCode)
{
returnValue = await response.Content.ReadAsStringAsync();
}
参考资料
以下是一些 Stack Overflow 答案,进一步说明了这一点:
- https://dev59.com/n1oU5IYBdhLWcg3wAjcs#37929393
- https://dev59.com/72gv5IYBdhLWcg3wVPTU#10679340