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

use*_*111 3 c#

这里有一个类似的SO 问题,它讨论了HttpClient对象的性能并建议HttpClient每个应用程序使用一个实例。我的项目要求我将多个 Web 服务请求发送到同一个 URI,但每个请求都有一组不同的标头。我是否应该HttpClient为每个请求创建一个新实例,知道DefaultRequestHeaders如果我使用static实例,所有请求都将相同。

Chr*_*jen 11

你可以:

  • 在全局实例上设置默认标头
  • 创建多个具有不同默认配置的全局(逻辑)实例
  • 为每个请求设置(附加)标头
  • 使用 IHttpClientFactory 创建新的 HttpClient

文档: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)