Мой вопрос немного связан с этим: эквивалент WebApi для HttpContext.Items с Injection Dependency.
Мы хотим ввести класс с использованием HttpContext.Current в области WebApi с помощью Ninject.
Меня беспокоит, что это может быть очень опасно, так как в WebApi (все?) есть async.
Пожалуйста, исправьте меня, если я ошибаюсь в этих точках, это то, что я исследовал до сих пор:
-
HttpContext.Current получает текущий контекст по потоку (я напрямую смотрел на реализацию).
-
Использование HttpContext.Current внутри async Задача невозможна, поскольку она может работать в другом потоке.
-
WebApi использует IHttpController с методом
Task<HttpResponseMessage> ExecuteAsync
= > каждый запрос isync = > вы не можете использовать HttpContext.Current внутри метода действия. Это может даже произойти, больше запросов выполняются в одном потоке с помощью проверки соответствия. -
Для создания контроллеров с инъецируемым материалом в конструкторы IHttpControllerActivator используется с методом синхронизации
IHttpController Create
. Это, где ninject создает контроллер со всеми его зависимостями.
-
Если я прав во всех этих четырех точках, использование HttpContext.Current внутри метода действия или любого нижележащего слоя очень опасно и может иметь неожиданные результаты. Я видел на SO много принятых ответов, предлагая именно это. IMHO это может работать некоторое время, но будет работать под нагрузкой.
-
Но при использовании DI для создания контроллера и его зависимостей, это нормально, потому что это выполняется на одном отдельном потоке. Я мог бы получить значение из HttpContext в конструкторе, и это было бы безопасно?. Интересно, создается ли каждый контроллер в одном потоке для каждого запроса, так как это может вызвать проблему при тяжелых нагрузках, где могут потребляться все потоки из IIS.
Просто чтобы объяснить, почему я хочу вставлять материал HttpContext:
- одним из решений было бы получить запрос в методе действия контроллера и передать необходимое значение всем слоям как param, пока оно не будет использоваться где-то глубоко в коде.
-
наше желаемое решение: все слои между ними не зависят от этого, и мы можем использовать введенный запрос где-то глубоко в коде (например, в некоторых ConfigurationProvider, который зависит от URL-адреса).
Пожалуйста, дайте мне свое мнение, если я ошибаюсь или мои предложения верны, поскольку эта тема кажется очень сложной. спасибо заранее!