首页 > 解决方案 > 如何注册将验证域用户的 HttpClient

问题描述

我必须将 HttpClient 配置为自动传递 Windows 凭据(我正在调用的公司 API 正在使用 Windows 身份验证)。到目前为止,我在我的方法中创建了 HttpClient,如下所示:

var credentialsCache = new CredentialCache {{
  new Uri("https://localhost"),
  "NTLM",
  CredentialCache.DefaultNetworkCredentials
 }};
var handler = new HttpClientHandler { Credentials = credentialsCache };
var client = new HttpClient(handler);

但由于这可能导致套接字耗尽,我想使用工厂。因此在里面Startup.cs我会像这样添加HttpClient:

public void ConfigureServices(IServiceCollection services)
{
 // ...
 services.AddHttpClient();
}

然后我会通过构造函数将工厂注入到我的服务中:

public class MyService
{
 private readonly IHttpClientFactory clientFactory;
 public MyService(IHttpClientFactory clientFactory)
 {
  this.clientFactory = clientFactory;
 }
 public async Task MakeHttpRequest()
 {
  var request = new HttpRequestMessage(HttpMethod.Get, "https://localhost/endpoint");
  var client = clientFactory.CreateClient();
  var response = await client.SendAsync(request);
  // ...
 }
}

如何配置以这种方式创建的客户端以使用网络凭据?理想情况下,我只想在里面配置一次ConfigureServices()

标签: c#asp.net-coredependency-injectiondotnet-httpclient

解决方案


您可以使用选项模式来设置如何IHttpClientFactory创建HttpClient. 您可以通过以下方式配置这些选项

未命名的选项,这些将应用于HttpClient工厂创建的所有实例

services.Configure<HttpClientFactoryOptions>(options =>
{
    options.HttpMessageHandlerBuilderActions.Add(builder =>
    {
        var credentialsCache = new CredentialCache {{
            new Uri("https://localhost"),
            "NTLM",
            CredentialCache.DefaultNetworkCredentials
        }};
        builder.PrimaryHandler = new HttpClientHandler { Credentials = credentialsCache };
    });
});

命名选项,这些仅适用于HttpClient将名称传递给CreateClient工厂方法的实例

services.Configure<HttpClientFactoryOptions>("myclient", options =>
{
    options.HttpMessageHandlerBuilderActions.Add(builder =>
    {
        var credentialsCache = new CredentialCache {{
            new Uri("https://localhost"),
            "NTLM",
            CredentialCache.DefaultNetworkCredentials
        }};
        builder.PrimaryHandler = new HttpClientHandler { Credentials = credentialsCache };
    });
});

要使用命名选项,你会做

var client = clientFactory.CreateClient("myclient");

推荐阅读