这里有一个类似的SO问题,讨论了HttpClient
对象的性能,并建议在应用程序中使用一个HttpClient
实例。我的项目需要向相同的URI发送多个webservice请求,但每个请求都有不同的标头集。如果我使用static
实例,则所有请求的DefaultRequestHeaders
将相同,那么我是否应该为每个请求创建一个新的HttpClient
实例?
你可以:
文档: https://learn.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-2.1
在这里,您可以创建一个客户端实例并添加将应用于所有请求的标头。
var client = new HttpClient();
client.DefaultRequestHeaders.Add("Content-Type", contentTypeValue);
在这个 dotnet core 2.1 的例子中,我们注册了一个预配置的命名实例:
services.AddHttpClient("github", c =>
{
c.BaseAddress = new Uri("https://api.github.com/");
// Github API versioning
c.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");
// Github requires a user-agent
c.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample");
});
稍后我们将注入 IHttpClientFactory
,并像这样获取预配置的客户端:
var client = _clientFactory.CreateClient("github");
除了命名客户端外,还有一种名为“类型化客户端”的替代方案:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-5.0#typed-clients。这两种方法都将基本配置保持在一个地方。
如果您的标头仅属于单个请求,请仅为该请求设置它们。
var client = new HttpClient();
var request = new HttpRequestMessage();
request.Headers.Add("Content-Type", "text/plain");
var response = await client.SendAsync(request);
使用此方法,您可以使用共享的HttpClient
实例。
如果您想要一个新的“干净”HttpClient实例,则在asp.net core中推荐的方法是注入IHttpClientFactory
并使用_clientFactory.CreateClient()
。
public class MyService {
public MyService (IHttpClientFactory clientFactory)
{
_clientFactory = clientFactory;
}
public async Task DoSomething()
{
var client = _clientFactory.CreateClient();
// do request
}
}