patterncsharpCritical
Single instance of reusable HttpClient
Viewed 0 times
instancereusablesinglehttpclient
Problem
I've got this method and I realize that an instance of
What I'm thinking of is something like this:
My worry is, though, that the different calls utilizing the same client instance will somehow collide and call huge issues later on, especially if the number of calls per time unit raises beyond a critical level. Should I be worried?
HttpClass is going to be created for each call to it. While working seemingly OK, I'm considering moving it out and placing it as a private property accessible to each call to the method. There might be other methods making use of it in the future as well. I have no information on how often these calls will occur. (There's a try/catch too but it's omitted for brevity's sake.)[OperationContract]
[WebGet(UriTemplate = "Poof"]
public async Task GetPoof()
{
String url = BaseUrl + "poofy";
using (HttpClient client = new HttpClient())
{
client.DefaultRequestHeaders.TryAddWithoutValidation(
"Authorization", GetAuthorizationSchema());
HttpResponseMessage message = await client.GetAsync(url);
return await message.Content.ReadAsStringAsync();
}
}What I'm thinking of is something like this:
private HttpClient _Client
private HttpClient Client { get { return _Client ?? GetNewClient(); } }
[OperationContract]
[WebGet(UriTemplate = "Poof"]
public async Task GetPoof()
{
String url = BaseUrl + "poofy";
HttpResponseMessage message = await client.GetAsync(url);
return await message.Content.ReadAsStringAsync();
}My worry is, though, that the different calls utilizing the same client instance will somehow collide and call huge issues later on, especially if the number of calls per time unit raises beyond a critical level. Should I be worried?
Solution
You don't need multiple instances. In fact,
There's already a lot written about this so I'll redirect you to those resources:
-
Do HttpClient and HttpClientHandler have to be disposed?
-
Is HttpClient safe to use concurrently?
-
What is the overhead of creating a new HttpClient per call in a WebAPI client?
HttpClient is designed specifically to persist and be used for multiple requests (see: HttpClient.DefaultRequestHeaders).There's already a lot written about this so I'll redirect you to those resources:
-
Do HttpClient and HttpClientHandler have to be disposed?
-
Is HttpClient safe to use concurrently?
-
What is the overhead of creating a new HttpClient per call in a WebAPI client?
Context
StackExchange Code Review Q#69950, answer score: 59
Revisions (0)
No revisions yet.