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

Bru*_*ino 5 .net c# dotnet-httpclient .net-core httpclientfactory

  • 直接地,我的意思是没有Asp.Net Core IoC / DI帮助程序。

我没有找到有关它的文档,我认为我当前的解决方案不是最佳的,因为处理程序生命周期不是由HttpClientFactory管理的:

var proxiedHttpClientHandler = new HttpClientHandler() { Proxy = httpProxy };
_createHttpClient = () => HttpClientFactory.Create(proxiedHttpClientHandler);
Run Code Online (Sandbox Code Playgroud)

有更好的解决方案吗?

Nko*_*osi 8

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

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

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

从那里开始,只需配置客户端即可

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

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

var services = serviceCollection.BuildServiceProvider();
Run Code Online (Sandbox Code Playgroud)

这样在通过解决方案致电客户时 IHttpClientFactory

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

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

返回的客户端将把处理程序与代理一起使用。


Ben*_*Ben 5

你可以这样做:

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();
Run Code Online (Sandbox Code Playgroud)

有一个很好的讨论,在这里关于使用手动工厂与实例化一个HttpClient的对象。

  • 我正在实现一个 http 调度程序。它在消息消耗循环内调用并发布到 webhook。我假设我*必须*使用 HttpClientFactory:https://docs.microsoft.com/en-us/dotnet/standard/microservices-architecture/implement-resilient-applications/use-httpclientfactory-to-implement-resilient- http-请求 (2认同)