Мне нужно получить доступ к току HttpContext
статическим методом или служебной службой.
С классическим ASP.NET MVC и System.Web
я бы просто использовал HttpContext.Current
для статического доступа к контексту. Но как мне это сделать в ASP.NET Core?
c#
asp.net-core
maxswitcher
источник
источник
IHttpContextAccessor
это будет доступно только в тех местах, где контейнер DI разрешает экземпляр.CallContextServiceLocator
для разрешения службы, даже из не-DI-закачиваемой например:CallContextServiceLocator.Locator.ServiceProvider.GetService<IHttpContextAccessor>()
. На практике это отличная вещь, если вы можете этого избежать :)Necromancing.
ДА МОЖНО
Секретный совет для тех, кто мигрирует
джонкикуски (вздох, оговорка по Фрейду) кода.Следующий метод является злым карбункулом хака, который активно выполняет экспресс-работу сатаны (в глазах разработчиков .NET Core), но он работает :
В
public class Startup
добавить недвижимость
А затем добавьте одноэлементный IHttpContextAccessor в DI в ConfigureServices.
Затем в Configure
добавьте параметр DI
IServiceProvider svp
, чтобы метод выглядел так:Затем создайте класс замены для System.Web:
Теперь в Configure, куда вы добавили
IServiceProvider svp
, сохраните этого поставщика услуг в статической переменной «ServiceProvider» в только что созданном фиктивном классе System.Web.HttpContext (System.Web.HttpContext.ServiceProvider)и установите для HostingEnvironment.IsHosted значение true
По сути, это то, что сделал System.Web, только вы никогда этого не видели (я предполагаю, что переменная была объявлена как внутренняя, а не общедоступная).
Как и в веб-формах ASP.NET, вы получите NullReference, когда пытаетесь получить доступ к HttpContext, когда его нет, например, как раньше в
Application_Start
global.asax.Еще раз подчеркиваю, это работает, только если вы действительно добавили
как я написал, вам следует.
Добро пожаловать в шаблон ServiceLocator в шаблоне DI;)
Чтобы узнать о рисках и побочных эффектах, обратитесь к своему лечащему врачу или фармацевту - или изучите источники .NET Core на github.com/aspnet и проведите небольшое тестирование.
Возможно, более удобный метод добавит этот вспомогательный класс
А затем вызов HttpContext.Configure в Startup-> Configure
источник
Самый законный способ, который я придумал, - это вставить IHttpContextAccessor в вашу статическую реализацию следующим образом:
Затем назначение IHttpContextAccessor в Startup Configure должно выполнить свою работу.
Думаю, вам также необходимо зарегистрировать синглтон службы:
источник
Просто чтобы добавить к другим ответам ...
В ASP.NET 2.1 Ядра, есть метод расширения , который будет зарегистрировать с правильной жизнью:
AddHttpContextAccessor
IHttpContextAccessor
источник
Согласно этой статье: Доступ к HttpContext вне компонентов фреймворка в ASP.NET Core
Затем:
Затем:
Вы можете использовать это так:
источник
При запуске
В контроллере
источник