HttpContextAccessor поток безопасен? - PullRequest
0 голосов
/ 29 октября 2018

Существует два обычных способа доступа к HttpContext пользователя через:

  • IHttpContextAccessor (и HttpContextAccessor), которые внедряются для служб следующим образом: httpContextAccessor.HttpContext
  • Или через свойство контроллера как: this.HttpContext

В моей кодовой базе мы используем оба случая. Для использования HttpContextAccessor они у нас есть в основном в общих одноэлементных сервисах, которые совместно используются для каждого запроса (таких как ведение журнала, обработка сеанса и т. Д.). Я думаю, что это должно быть поточно-ориентированным, поскольку HttpContextAccessor должен знать, как с этим справиться, но я вижу этот твит, который отбрасывает меня: https://twitter.com/davidfowl/status/907248318538903553

Пока все выглядит хорошо, но есть ли подтверждение, что оно поточно-ориентированное?

1 Ответ

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

Вы путаете два разных понятия. Безопасность потоков только косвенно связана с HTTP-запросами, поскольку HTTP-запрос требует использования потока. Это довольно много, хотя. HttpContext является областью запроса, поэтому в контексте одного запроса у вас не будет утечки, если вы остаетесь только в одном потоке, или все рабочие потоки выполняются в контексте этого конкретного запроса.

Когда дела идут наперекосяк, вы начинаете запускать потоки, которые работают в фоновом режиме, то есть вне конвейера запросов. В таких ситуациях HttpContext может существовать или не существовать, либо он может отличаться для фонового потока от исходного потока. Вот тут-то и наступает небезопасная нить.

Длинно и коротко, независимо от того, является ли HttpContext поточно-ориентированным, неправильный вопрос. Вместо этого вам нужно спросить, какая работа выполняется в потоке и в каком контексте. Если вы находитесь в конвейере запросов, то HttpContext будет эффективно поточно-ориентированным, но для этого потребуется захват всех запущенных вами потоков, что в значительной степени сводит на нет полезность использования нескольких потоков. С тем же успехом вы можете просто выполнить всю работу над исходной веткой. Обработка веб-запроса - это не то же самое, что настольное или мобильное приложение. В последнем случае вы должны оставить основной поток или поток пользовательского интерфейса свободным, поэтому выделение потоков является обязательным. Сеть не работает таким образом; все потоки являются временными, обслуживая определенный запрос и затем возвращаясь в пул.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...