c# - 如何注册将验证域用户的 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()
解决方案
您可以使用选项模式来设置如何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");
推荐阅读
- linux - 如何获取共享内存的物理地址
- ios - 请在 ScrollView 中编码布局
- javascript - Nativescript getElementsByClassName() 错误
- python - 将两个矩阵 (2x1) 和 (2x2(
- python - 如何使用 numpy 在数组中使用 mod
- xslt - XSLT 1.0 For Each if 输出
- ios - 如何在 Swift 的导航栏顶部显示自定义视图?
- typescript - 在 Foo 中访问类型 T
- swift - 我的 locationSearchTable 并不总是产生正确的结果......为什么?
- scala - 在单机上运行的集群占用了太多的 /dev/shm 空间