如何使用 HttpClientFactory 为命名的 HttpClient 定义 HttpClientHandler

Ton*_*zel 5 asp.net dotnet-httpclient .net-core asp.net-core httpclientfactory

旧代码:

Client = new HttpClient(new HttpClientHandler() { DefaultProxyCredentials = CredentialCache.DefaultNetworkCredentials });

// set an default user agent string, some services does not allow emtpy user agents
if (!Client.DefaultRequestHeaders.Contains("User-Agent"))
    Client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0");
Run Code Online (Sandbox Code Playgroud)

尝试使用新的 ASP.NET Core 2.1 HttpClientFactory 实现相同的功能:

services.AddHttpClient("Default", client =>
        {
            client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0");
        }).ConfigurePrimaryHttpMessageHandler(handler => new HttpClientHandler() { DefaultProxyCredentials = CredentialCache.DefaultNetworkCredentials });          
Run Code Online (Sandbox Code Playgroud)

不幸的是,我收到一个 HTTP 407(代理身份验证)错误。我做错了什么?

Nko*_*osi 6

通常建议使用包含客户端名称字符串常量的静态类。

就像是:

public static class NamedHttpClients {
    public const string Default = "Default";
}
Run Code Online (Sandbox Code Playgroud)

然后确保命名客户端配置正确,在您的特定情况下,它看起来像:

services
    .AddHttpClient(NamedHttpClients.Default, client => {
        client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0");
    })
    .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler() { 
        DefaultProxyCredentials = CredentialCache.DefaultNetworkCredentials 
    }); 
Run Code Online (Sandbox Code Playgroud)

从那里你可以从注入的客户端中获取客户端 IHttpClientFactory

var client = httpClientFactory.CreateClient(NamedHttpClients.Default);
Run Code Online (Sandbox Code Playgroud)

并按预期使用。