Как получить объект 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
.