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

Posted

技术标签:

【中文标题】如何使用 HttpClientFactory 为命名的 HttpClient 定义 HttpClientHandler【英文标题】:How to define a HttpClientHandler for named HttpClient using HttpClientFactory 【发布时间】:2018-06-26 13:50:04 【问题描述】:

旧代码:

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");

尝试使用新的 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 );          

很遗憾,我收到了 HTTP 407(代理身份验证)错误。 我做错了什么?

【问题讨论】:

你的问题怎么没有更多的赞成票?当您搜索此内容时,Google 上几乎没有任何内容。 【参考方案1】:

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

类似:

public static class NamedHttpClients 
    public const string Default = "Default";

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

services
    .AddHttpClient(NamedHttpClients.Default, client => 
        client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0");
    )
    .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler()  
        DefaultProxyCredentials = CredentialCache.DefaultNetworkCredentials 
    ); 

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

var client = httpClientFactory.CreateClient(NamedHttpClients.Default);

并按预期使用。

【讨论】:

以上是关于如何使用 HttpClientFactory 为命名的 HttpClient 定义 HttpClientHandler的主要内容,如果未能解决你的问题,请参考以下文章

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

如何使用 Moq 在 .NET Core 2.1 中模拟新的 HttpClientFactory

第二十六节:扩展如何在控制台中使用HttpClientFactory读取配置文件数据保护注入类

如何使用 Httpclientfactory Typed 客户端调用装饰有 ValidateAntiForgeryToken 的服务器 api?

使用 .NET 4.6.2 中的 HttpClientFactory

用HttpClientFactory来实现简单的熔断降级