Как получить объект HttpContext из HttpContextBase в ASP.NET MVC 1?
Я работаю с некоторыми WebForms/MVC-агностическими инструментами, и мне нужно получить экземпляр HttpContext
дали ссылку на
3 ответа:
самый простой способ-получить приложение,
ApplicationInstance
иContext
свойства:// httpContextBase is of type HttpContextBase HttpContext context = httpContextBase.ApplicationInstance.Context;
(спасибо Измаил Смирнов кто отметил это в комментариях)
оригинальный ответ:
можно, особенно если
HttpContextBase
экземпляр, который вам вручили, имеет типHttpContextWrapper
во время выполнения. В следующем примере показано, как это можно сделать. Он предполагает, что вы есть метод с именемFoo
, который принимает контекст какHttpContextBase
но затем нужно вызвать метод в сторонней сборке (что вам может не повезти изменить), который ожидает, что контекст будет набран какHttpContext
.void Foo(HttpContextBase context) { var app = (HttpApplication) context.GetService(typeof(HttpApplication)); ThirdParty.Bar.Baz(app.Context); } // Somewhere in assembly and namespace ThirdParty, // in a class called Bar, there is Baz expecting HttpContext: static void Baz(HttpContext context) { /* ... */ }
HttpContextBase
имеет метод под названиемGetService
в результате поддержкиIServiceProvider
. ЭлементGetService
переопределениеHttpContextWrapper
делегатыGetService
реализация завернутыеHttpContext
экземпляра. ЭлементGetService
реализацияHttpContext
позволяет запрашивать обычных подозреваемых, таких какHttpApplication
,HttpRequest
,HttpResponse
и так далее. Так уж получилось, чтоHttpApplication
есть свойство под названием контекст и который возвращает экземплярHttpContext
. Так что один получает на завернутыйHttpContext
экземпляр, попросивHttpContextBase
наHttpApplication
черезGetService
с последующим чтениемContext
имущество возвращеноHttpApplication
экземпляра.в отличие от
HttpContextBase
,GetService
не является публичным членомHttpContext
потому чтоHttpContext
осуществляетIServiceProvider.GetService
явного в то время какHttpContextBase
нет.имейте в виду, что
Foo
больше не тестируется, потому что он полагается на возможность развернуть базовыйHttpContext
во время тестирования и который почти невозможно подделать/заглушка в первую очередь. Однако смысл этого ответа заключается в том, чтобы ответить на вопрос: "Как получить объект HttpContext из HttpContextBase?",буквально. Иллюстрированный метод полезен в в тех ситуациях, когда вы оказываетесь зажатым между компонентами, у вас не обязательно есть роскошь для изменения.
ты не можешь.
цель
HttpContextBase
Это абстрагироваться от зависимости от конкретногоHttpContext
класса. В то время как он мая содержать конкретныеHttpContext
(например, в случае сhttpContextWrapper
), другие реализации могут не иметь абсолютно ничего общего сHttpContext
.ваш лучший вариант-определить пользовательскую абстрактную фабрику, которая может получить
HttpContextBase
для вас, так как вы всегда можете обернуть бетонаHttpContext
наHttpContextWrapper
.