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


вы можете

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

ты не можешь.

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

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