Найпростіший спосіб - отримати додаток 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
explicity, поки HttpContextBase
цього не робить.
Майте на увазі, що Foo
це більше не перевіряється, оскільки він покладається на те, що зможете розгортати основу HttpContext
під час тестування, і це, поряд з неможливим підробляти / заглушувати в першу чергу. Суть цієї відповіді, однак, полягає у вирішенні питання "Як отримати об'єкт HttpContext з HttpContextBase?", Буквально . Проілюстрована методика корисна в тих ситуаціях, коли ви опинилися затиснутими між компонентами, не обов'язково повинні змінювати розкіш.