这里有一个类似的SO 问题,它讨论了HttpClient对象的性能并建议HttpClient每个应用程序使用一个实例。我的项目要求我将多个 Web 服务请求发送到同一个 URI,但每个请求都有一组不同的标头。我是否应该HttpClient为每个请求创建一个新实例,知道DefaultRequestHeaders如果我使用static实例,所有请求都将相同。
Chr*_*jen 11
你可以:
文档:https : //docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests? view = aspnetcore- 2.1
在这里,您创建一个客户端实例并添加将应用于所有请求的标头。
var client = new HttpClient();
client.DefaultRequestHeaders.Add("Content-Type", contentTypeValue);
Run Code Online (Sandbox Code Playgroud)
在这个 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");
});
Run Code Online (Sandbox Code Playgroud)
稍后我们将注入IHttpClientFactory,并像这样获得这个预先配置的客户端:
var client = _clientFactory.CreateClient("github");
Run Code Online (Sandbox Code Playgroud)
命名客户端的替代方法是“类型化客户端”:https : //docs.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);
Run Code Online (Sandbox Code Playgroud)
使用这种方法,您可以使用共享HttpClient实例。
如果你想要一个新的“干净”的 HttpClient 实例,推荐的 asp.net 核心方法是注入IHttpClientFactory和使用_clientFactory.CreateClient().
public class MyService {
public MyService (IHttpClientFactory clientFactory)
{
_clientFactory = clientFactory;
}
public async Task DoSomething()
{
var client = _clientFactory.CreateClient();
// do request
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5364 次 |
| 最近记录: |