Как получить объект HttpContext из HttpContextBase в ASP.NET MVC 1?
Я работаю с некоторыми инструментами WebForms/MVC-agnostic, и мне нужно получить экземпляр HttpContext дали ссылку на
3 ответов
самый простой способ-получить приложение,ApplicationInstance и Context свойства:
// httpContextBase is of type HttpContextBase
HttpContext context = httpContextBase.ApplicationInstance.Context;
(спасибо Smyrnow Измаил кто отметил это в комментариях)
оригинальный ответ:
вы можете, особенно если 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. The GetService переопределение HttpContextWrapper делегаты GetService реализация завернутые HttpContext экземпляра. The GetService реализация HttpContext позволяет запрашивать обычных подозреваемых, таких как HttpApplication, HttpRequest, HttpResponse и так далее. Так уж случилось, что HttpApplication есть свойство под названием контекст и который возвращает экземпляр HttpContext. Так складывается в обернутом HttpContext экземпляр, попросив HttpContextBase на HttpApplication via GetService затем чтение Context имущество возвращено HttpApplication экземпляра.
в отличие от HttpContextBase, GetService не отображается как публичный член HttpContext потому что HttpContext осуществляет IServiceProvider.GetService явного в то время как HttpContextBase нет.
имейте в виду, что Foo больше не тестируется, потому что он полагается на возможность развернуть базовый HttpContext во время тестирования и который почти невозможно подделать/заглушка в первую очередь. Однако смысл этого ответа заключается в том, чтобы ответить на вопрос: "Как получить объект HttpContext из HttpContextBase?", буквально. Иллюстрированный метод полезен в в тех ситуациях, когда вы оказываетесь зажаты между компонентами, у вас не обязательно есть роскошь для изменения.
ты не можешь.
цель HttpContextBase абстрактный зависимости от конкретных HttpContext класса. В то время как он мая содержать конкретные HttpContext (например, в случае с httpContextWrapper), другие реализации могут не иметь абсолютно ничего общего с HttpContext.
ваш лучший вариант-определить пользовательскую абстрактную фабрику, которая может получить HttpContextBase для вас, так как вы всегда можете обернуть бетона HttpContext на HttpContextWrapper.