HttpClass
创建一个实例。尽管工作正常,但我正在考虑将其移出并将其作为可调用该方法的私有属性。将来可能还会有其他方法使用它。我没有这些电话多久发生一次的信息。 (也有一个try
/ catch
,但为简洁起见,省略了它。)[OperationContract]
[WebGet(UriTemplate = "Poof"]
public async Task<String> 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();
}
}
我在想的是这样的:
private HttpClient _Client
private HttpClient Client { get { return _Client ?? GetNewClient(); } }
[OperationContract]
[WebGet(UriTemplate = "Poof"]
public async Task<String> GetPoof()
{
String url = BaseUrl + "poofy";
HttpResponseMessage message = await client.GetAsync(url);
return await message.Content.ReadAsStringAsync();
}
但是,我担心的是,利用同一客户端实例的不同呼叫将以某种方式发生冲突,并在以后呼叫巨大的问题,尤其是如果每个时间单位的呼叫次数超过了临界水平时。我应该担心吗?
#1 楼
您不需要多个实例。实际上,HttpClient
是专门为持久化而设计的,并且可以用于多个请求(请参阅:HttpClient.DefaultRequestHeaders
)。已经有很多关于此的文章,所以我将您重定向到这些资源:
必须丢弃HttpClient和HttpClientHandler吗?
HttpClient可以安全地同时使用吗?
在WebAPI客户端中每个调用创建一个新的HttpClient的开销是多少?
#2 楼
我建议private HttpClient Client { get { return _Client = _Client ?? GetNewClient(); } }
代替
private HttpClient Client { get { return _Client ?? GetNewClient(); } }
评论
\ $ \ begingroup \ $
这说明了如何利用HttpClient安全地并发使用-而不是尝试。
\ $ \ endgroup \ $
–灰胡子
18 Mar 7 '18 at 5:39
\ $ \ begingroup \ $
实际上,我更喜欢使用静态HttpClient变量和主类的静态构造函数中的初始化
\ $ \ endgroup \ $
– Moises Alexander Salazar Vila
18-3-7在10:41