我必须将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");
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句