具有Content.ReadAsAsync方法的HttpClient多线程

时间:2018-10-06 07:44:20

标签: c# asp.net asp.net-web-api asp.net-web-api2 asp.net-core-webapi

我一直在大量阅读有关HttpClient的内容,并意识到由于必须为每个请求实例化一个新的HttpClient对象,因此我不得不更改RestHandler的实现。我们对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; }
}

最好的问候 罗伯特

1 个答案:

答案 0 :(得分:1)

阅读: You're using httpClient wrong and it's destabilizing your software

它讨论了HttpClient如何真正可重入和线程安全。它还证明了为什么您应该在整个应用程序中使用单个HttpClient的情况。

你在做什么对我来说很好。

顺便说一句,我个人在使用HttpClient和Mono时遇到了问题。我们使用RestSharp并更喜欢它。