Многопоточность HttpClient с методом Content.ReadAsAsync - PullRequest
0 голосов
/ 06 октября 2018

Я много читал о 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; }
}

С уважением Роберт

1 Ответ

0 голосов
/ 06 октября 2018

Прочитайте это: Вы неправильно используете httpClient, и это дестабилизирует ваше программное обеспечение

Это говорит о том, что HttpClient действительно реентерабелен и поточно-ориентирован.Это также доказывает, почему вы должны использовать один единственный HttpClient для всего приложения.

То, что вы делаете, выглядит хорошо для меня.

Кстати, лично япроблемы с HttpClient и Mono.Мы используем RestSharp и предпочитаем его.

...