Reputation: 311
I didn't find docs about it and I think my current solution isn't optimal because the handler lifecyle isn't managed by the HttpClientFactory:
var proxiedHttpClientHandler = new HttpClientHandler() { Proxy = httpProxy };
_createHttpClient = () => HttpClientFactory.Create(proxiedHttpClientHandler);
Is there a better solution?
Upvotes: 16
Views: 32973
Reputation: 247068
When adding the client to the service collection you should be able to configure the handler there
Using the named client approach I'll use a constant to hold the client name.
public static class NamedHttpClients {
public const string ProxiedClient = "ProxiedClient";
}
From there it is just a matter of configuring the client
//...
var serviceCollection = new ServiceCollection();
serviceCollection
.AddHttpClient(NamedHttpClients.ProxiedClient)
.ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler() {
Proxy = httpProxy
});
var services = serviceCollection.BuildServiceProvider();
So that when calling the client via a resolved IHttpClientFactory
var httpClientFactory = services.GetService<IHttpClientFactory>();
var client = httpClientFactory.CreateClient(NamedHttpClients.ProxiedClient);
the returned client will use the handler with the proxy.
Upvotes: 28
Reputation: 645
You can do something like this:
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();
There's a good discussion here about using factory vs. manually instantiating an httpClient object.
Upvotes: 10