Безопасно ли использовать HttpClientFactory?

В моем основном приложении MVC asp.net я использую HttpClientFactory для создания объекта HttpClient для запросов к серверу API.

В соответствии с документом Microsoft, объект HttpClient создается каждый раз, когда я вызываю HttpClientFactory.CreateClient(), поэтому будет безопасно устанавливать значения HttpClient.DefaultRequestHeaders.

О HttpMessageHandler объектах, потому что они объединены в пул и могут быть повторно использованы позже. Таким образом, если они содержат информацию о файлах cookie (например, установка файлов cookie для объекта HttpClientHandler), мы нарушим потокобезопасность.

Верно ли мое предположение? Как мы могли бы справиться с этой проблемой?

Ничего, если мы установим cookie в HttpRequestMessage, тогда мы отправим его с HttpClient?


person tuq    schedule 21.12.2018    source источник
comment
Вы должны использовать 1 экземпляр HttpClient и использовать SendAsync, если вам нужно манипулировать заголовками и/или файлами cookie и т.д. Подробнее читайте здесь. Обратите внимание, что в статье только подчеркивается проблема, если вам нужно манипулировать различной общей информацией о состоянии в HttpClient, вместо этого вам нужно использовать SendAsync.   -  person Lasse V. Karlsen    schedule 21.12.2018
comment
@LasseVågsætherKarlsen, в ядре asp.net мы должны использовать HttpClientFactory для создания объекта HttpClient. Как вы сказали, мы также можем использовать singleton для HttpClient, но это вызовет проблему: github.com/dotnet/corefx/issues/11224. Мне просто интересно, если мы используем HttpClientFactory, объекты HttpClientHandler в пуле могут вызвать проблемы с потокобезопасностью.   -  person tuq    schedule 21.12.2018
comment
Сам класс CookieContainer является потокобезопасным. Вы можете см. код самостоятельно для контейнера cookie, когда он манипулирует массивом cookie.   -  person Simply Ged    schedule 22.12.2018
comment
@SimplyGed, возможно, CookieContainer сам по себе потокобезопасен, но когда он используется в случае HttpClientFactory, это может вызвать проблему. Например: 1. HttpClient1 send request to API api/checkAccessStatus =› 2. API check if Request1.Cookie contains "HasAccessed" key, if not, set Response.Cookie["HasAccessed"] = true =› 3. (From other user) HttpClient2 send request to API api/checkAccessStatus =› 4. Since HttpClient2 is created with HttpClientFactory, it can have same HttpHandler (same CookieContainer). API will see that Request.Cookie["HasAccessed"] is true =› Неправильно   -  person tuq    schedule 25.12.2018


Ответы (1)


Я нашел решение использовать HttpClientFactory. Мы должны отключить CookieContainer основного HttpMessageHanlder (это HttpClientHandler):

services.AddHttpClient("configured-inner-handler")
.ConfigurePrimaryHttpMessageHandler(() =>
{
    return new HttpClientHandler()
    {
        UseCookies = false
    };
});
person tuq    schedule 28.12.2018