使用HttpClient发送带有不同标头的请求

4

这里有一个类似的SO问题,讨论了HttpClient对象的性能,并建议在应用程序中使用一个HttpClient实例。我的项目需要向相同的URI发送多个webservice请求,但每个请求都有不同的标头集。如果我使用static实例,则所有请求的DefaultRequestHeaders将相同,那么我是否应该为每个请求创建一个新的HttpClient实例?


虽然你不应该为每个实例创建一个新的 HttpClient,但为不同的目的创建几个不同的 HttpClient 并不是问题。 - Neil
1个回答

12

你可以:

  • 在全局实例上设置默认标头
  • 创建多个具有不同默认配置的全局(逻辑)实例
  • 为每个请求设置(额外的)标头
  • 使用IHttpClientFactory创建新的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实例。

IHttpClientFactory

如果您想要一个新的“干净”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
  }
}

我正在按照你的答案中的“每个请求头”方法实现我的逻辑。如果它能够按预期工作,我会告诉大家性能方面的影响并接受这个答案。 - user1451111

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接