В моем основном приложении MVC asp.net я использую HttpClientFactory
для создания объекта HttpClient
для запросов к серверу API.
В соответствии с документом Microsoft, объект HttpClient
создается каждый раз, когда я вызываю HttpClientFactory.CreateClient()
, поэтому будет безопасно устанавливать значения HttpClient.DefaultRequestHeaders
.
О HttpMessageHandler
объектах, потому что они объединены в пул и могут быть повторно использованы позже. Таким образом, если они содержат информацию о файлах cookie (например, установка файлов cookie для объекта HttpClientHandler
), мы нарушим потокобезопасность.
Верно ли мое предположение? Как мы могли бы справиться с этой проблемой?
Ничего, если мы установим cookie в HttpRequestMessage
, тогда мы отправим его с HttpClient
?
HttpClient
и использоватьSendAsync
, если вам нужно манипулировать заголовками и/или файлами cookie и т.д. Подробнее читайте здесь. Обратите внимание, что в статье только подчеркивается проблема, если вам нужно манипулировать различной общей информацией о состоянии вHttpClient
, вместо этого вам нужно использоватьSendAsync
. - person Lasse V. Karlsen   schedule 21.12.2018HttpClientFactory
для создания объектаHttpClient
. Как вы сказали, мы также можем использовать singleton дляHttpClient
, но это вызовет проблему: github.com/dotnet/corefx/issues/11224. Мне просто интересно, если мы используемHttpClientFactory
, объектыHttpClientHandler
в пуле могут вызвать проблемы с потокобезопасностью. - person tuq   schedule 21.12.2018CookieContainer
является потокобезопасным. Вы можете см. код самостоятельно для контейнера cookie, когда он манипулирует массивом cookie. - person Simply Ged   schedule 22.12.20181. 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