Самый простой способ - получить приложение 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
имеет свойство Context и возвращает экземпляр HttpContext
. Так один получает в обернутой HttpContext
инстанции с просьбой HttpContextBase
за HttpApplication
помощью с GetService
последующим чтением Context
свойства возвращаемого HttpApplication
экземпляра.
В отличие от этого HttpContextBase
, GetService
не отображается как открытый член, HttpContext
но это потому, что HttpContext
реализует IServiceProvider.GetService
простоту, а HttpContextBase
не делает.
Имейте в виду, что Foo
он больше не подлежит HttpContext
тестированию, поскольку полагается на возможность развернуть базовый элемент во время тестирования и, во-первых, практически невозможно подделать / заглушить. Суть этого ответа, однако, заключается в том, чтобы ответить на вопрос «Как получить объект HttpContext из HttpContextBase?», Буквально . Проиллюстрированная техника полезна в тех ситуациях, когда вы оказались зажаты между компонентами, которые не обязательно можете изменить.
context.ApplicationInstance.Context
?Http*Base
вариантов, возвращенныхHttpContextBase
. : P Я обновлю ответ.Ты можешь,
источник
Ты не можешь
Вся цель
HttpContextBase
состоит в том, чтобы абстрагироваться от зависимости от конкретногоHttpContext
класса. Хотя он может содержать конкретныйHttpContext
(как в случае сhttpContextWrapper
) , другие реализации могут не иметь абсолютно никакого отношения кHttpContext
.Лучший вариант - определить собственную абстрактную фабрику, которая может получить
HttpContextBase
для вас, поскольку вы всегда можете обернуть бетонHttpContext
вHttpContextWrapper
.источник
IHttpHandler
реализации, вы заканчиваете тем, что вынуждены помещать в абстракции (обертки Response) определенное количество абстракций только для своих модульных тестов, что не кажется правильным, но в конечном итоге является единственным вариантом.