Without using ASP.NET Core's DI, you can put a ClientHandler which contains a cookie container into the HttpClient object using its constructor, something similar to this:
var cookieContainer = new CookieContainer();
var handler = new HttpClientHandler() { CookieContainer = cookieContainer };
var client = new HttpClient(handler)
{
BaseAddress = new Uri(uri),
Timeout = TimeSpan.FromMinutes(5)
};
but when you try to use DI, you don't have the opportunity to call the HttpClient's constructor and pass the handler in. I tried this next line of code:
services.AddHttpClient<HttpClient>(client =>
{
client.BaseAddress = new Uri(uri);
client.Timeout = TimeSpan.FromSeconds(5);
});
but indeed, it doesn't have a cookie container when you get an instance.
You can do this by adding a named client instead (which have additional configuration options). We'll simply create a new HttpClientHandler
with a cookie container:
services.AddHttpClient("myServiceClient")
.ConfigureHttpClient(client =>
{
client.BaseAddress = new Uri(uri);
client.Timeout = TimeSpan.FromSeconds(5);
})
.ConfigurePrimaryHttpMessageHandler(
() => new HttpClientHandler() { CookieContainer = new CookieContainer() }
);
And then you can resolve the client like so:
public class MyService(IHttpClientFactory clientFactory)
{
// "myServiceClient" should probably be replaced in both places with a
// constant (const) string value to avoid magic strings
var httpClient = clientFactory.CreateClient("myServiceClient");
}
It's also possible to bind the HttpClient
to the service by supplying a generic parameter to AddHttpClient
:
services.AddHttpClient<MyService>("myServiceClient") // or services.AddHttpClient<MyServiceInterface, MyServiceImplementation>("myServiceClient")
.ConfigureHttpClient(client =>
{
client.BaseAddress = new Uri(uri);
client.Timeout = TimeSpan.FromSeconds(5);
})
.ConfigurePrimaryHttpMessageHandler(
() => new HttpClientHandler() { CookieContainer = new CookieContainer() }
);
And then you can simply accept an HttpClient
in your service:
public class MyService
{
public MyService(HttpClient httpClient)
{
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With