Как получить объект HttpContext из HttpContextBase в ASP.NET MVC 1?


Я работаю с некоторыми WebForms/MVC-агностическими инструментами, и мне нужно получить экземпляр HttpContext дали ссылку на

3 139

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

вы можете

var abstractContext = new System.Web.HttpContextWrapper(System.Web.HttpContext.Current);

ты не можешь.

цель HttpContextBase Это абстрагироваться от зависимости от конкретного HttpContext класса. В то время как он мая содержать конкретные HttpContext(например, в случае с httpContextWrapper), другие реализации могут не иметь абсолютно ничего общего с HttpContext.

ваш лучший вариант-определить пользовательскую абстрактную фабрику, которая может получить HttpContextBase для вас, так как вы всегда можете обернуть бетона HttpContext на HttpContextWrapper.