C# 使用Content.ReadAsAsync方法进行HttpClient多线程处理
我读了很多关于HttpClient的书,意识到我必须改变我们的RestHandler的实现,因为我们正在为每个请求实例化一个新的HttpClient对象。我们对RestHandler使用了大量请求(使用HttpClient) 问题:C# 使用Content.ReadAsAsync方法进行HttpClient多线程处理,c#,asp.net,asp.net-web-api,asp.net-web-api2,asp.net-core-webapi,C#,Asp.net,Asp.net Web Api,Asp.net Web Api2,Asp.net Core Webapi,我读了很多关于HttpClient的书,意识到我必须改变我们的RestHandler的实现,因为我们正在为每个请求实例化一个新的HttpClient对象。我们对RestHandler使用了大量请求(使用HttpClient) 问题: 我读到HttpClient上的几个(全部?)方法是线程安全的,这是否意味着我下面的代码在线程方面不会有任何问题,尽管我使用的是Content.ReadAsAsync 以这种方式使用HttpClient是否还有其他已知问题 现在,实现如下所示: public cl
- 我读到HttpClient上的几个(全部?)方法是线程安全的,这是否意味着我下面的代码在线程方面不会有任何问题,尽管我使用的是Content.ReadAsAsync
- 以这种方式使用HttpClient是否还有其他已知问题
public class RestHandler : IRestHandler
{
private static readonly HttpClient HttpClient = new HttpClient();
public RestHandler()
{
//HttpClient.DefaultRequestHEaders.Authorization = new AuthenticationHeaderValue(some logic);
//HttpClient.DefaultRequestHEaders.Add("id","customId");
}
public async Task<GenericResult<T>> GetResultAsync<T>(string url) where T : new()
{
var response = await HttpClient.GetAsync(url);
var result = await response.Content.ReadAsAsync<T>();
return new GenericResult<T> { HttpResponseMessage = response, Result = result};
}
}
public interface IRestHandler
{
Task<GenericResult<T>> GetResultAsync<T>(string url) where T : new();
}
public class GenericResult<T> where T : new()
{
public T Result { get; set; }
public HttpResponseMessage HttpResponseMessage { get; set; }
}
公共类RestHandler:IRestHandler
{
私有静态只读HttpClient HttpClient=新HttpClient();
公共RestHandler()
{
//HttpClient.DefaultRequestHEaders.Authorization=新的AuthenticationHeaderValue(某些逻辑);
//HttpClient.DefaultRequestHEaders.Add(“id”、“customId”);
}
公共异步任务GetResultAsync(字符串url),其中T:new()
{
var response=wait-HttpClient.GetAsync(url);
var result=await response.Content.ReadAsAsync();
返回新的GenericResult{HttpResponseMessage=response,Result=Result};
}
}
公共接口IRestHandler
{
任务GetResultAsync(字符串url),其中T:new();
}
公共类GenericResult,其中T:new()
{
公共T结果{get;set;}
公共HttpResponseMessage HttpResponseMessage{get;set;}
}
致意
罗伯特读这篇文章:
它讨论了HttpClient是如何真正可重入和线程安全的。它还证明了为什么您应该在整个应用程序中使用一个HttpClient
我觉得你做的很好
顺便说一句,我个人在HttpClient和Mono方面有问题。我们使用RestSharp并更喜欢它。为什么HttpClient是线程安全的,这是您的责任。您不能在RESTAPI中使用静态对象。另外,真正的异步调用也不是在线程上进行的,它们使用IO完成端口,因为Microsoft的文档中这么说,HttpClient的correvt实现是使用静态对象?还是我在这里遗漏了什么?