如何为直接通过HttpClientFactory创建的HttpClient配置Web代理?

15
  • 直接地指的是没有使用 Asp.Net Core IoC/DI 辅助工具。

我没有找到相关文档,并且我认为我的当前解决方案并不理想,因为处理程序的生命周期未由 HttpClientFactory 管理:

var proxiedHttpClientHandler = new HttpClientHandler() { Proxy = httpProxy };
_createHttpClient = () => HttpClientFactory.Create(proxiedHttpClientHandler);

有更好的解决方案吗?

2个回答

25

当将客户端添加到服务集合时,您应该能够在那里配置处理程序。

使用命名的客户端方法,我将使用一个常量来保存客户端名称。

public static class NamedHttpClients {
    public const string ProxiedClient = "ProxiedClient";
}

接下来只是客户端配置的问题。

//...
var serviceCollection = new ServiceCollection();

serviceCollection
    .AddHttpClient(NamedHttpClients.ProxiedClient)
    .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler() { 
        Proxy = httpProxy 
    });

var services = serviceCollection.BuildServiceProvider();

这样当通过已解析的 IHttpClientFactory 调用客户端时,

var httpClientFactory = services.GetService<IHttpClientFactory>();

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

返回的客户端将使用代理处理程序。


我没有使用Asp .Net Core IoC/DI及其辅助工具。我需要直接配置和使用HttpClientFactory。 - Bruno Fiorentino
那么你打算如何创建工厂呢?你知道你可以自己创建服务集合并获得服务提供程序的好处吗? - Nkosi
1
我不是在创建服务集合。这就是重点。这是一个基于控制台应用程序模板的项目(dotnet new console),与Asp .Net Core无关。我需要直接使用HttpClientFactory和HttpClient。 - Bruno Fiorentino
如果有这个选项那就好了,但我的问题是如何在没有服务集合IoC/DI基础设施的情况下完成它。这应该不难。 - Bruno Fiorentino
好的,明白了。这是一个带有 DI 的控制台示例。https://github.com/aspnet/HttpClientFactory/blob/master/samples/HttpClientFactorySample/Program.cs 我会检查是否有没有 DI 的示例。 - Nkosi

10
你可以这样做:
private HttpClient ClientFactory()
{
    var proxiedHttpClientHandler = new HttpClientHandler(){ UseProxy = true};
    proxiedHttpClientHandler.Proxy = new WebProxy("proxy address");
    var httpClient = new HttpClient(proxiedHttpClientHandler)
    {
        BaseAddress = new Uri("uri");
        Timeout = 2000; //if you need timeout;
    }
}
_createHttpClient = () => ClientFactory();

这里有一个关于使用工厂和手动实例化httpClient对象的讨论,链接在此


2
我正在实现一个 HTTP 调度程序。它在消息消费循环中被调用并发布到 Webhooks。我假设我 必须 使用 HttpClientFactory: https://learn.microsoft.com/en-us/dotnet/standard/microservices-architecture/implement-resilient-applications/use-httpclientfactory-to-implement-resilient-http-requests - Bruno Fiorentino

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接