Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Content.ReadAsAsync方法进行HttpClient多线程处理_C#_Asp.net_Asp.net Web Api_Asp.net Web Api2_Asp.net Core Webapi - Fatal编程技术网

C# 使用Content.ReadAsAsync方法进行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的书,意识到我必须改变我们的RestHandler的实现,因为我们正在为每个请求实例化一个新的HttpClient对象。我们对RestHandler使用了大量请求(使用HttpClient)

问题:

  • 我读到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实现是使用静态对象?还是我在这里遗漏了什么?