Самый простой способ - получить приложение 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?», Буквально . Проиллюстрированная техника полезна в тех ситуациях, когда вы оказались зажаты между компонентами, которые не обязательно можете изменить.