Как получить объект HttpContext из HttpContextBase в ASP.NET MVC 1?
Я работаю с некоторыми WebForms/MVC-агностическими инструментами, и мне нужно получить экземпляр HttpContext дали ссылку на
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?",буквально. Иллюстрированный метод полезен в в тех ситуациях, когда вы оказываетесь зажатым между компонентами, у вас не обязательно есть роскошь для изменения.
ты не можешь.
цель
HttpContextBaseЭто абстрагироваться от зависимости от конкретногоHttpContextкласса. В то время как он мая содержать конкретныеHttpContext(например, в случае сhttpContextWrapper), другие реализации могут не иметь абсолютно ничего общего сHttpContext.ваш лучший вариант-определить пользовательскую абстрактную фабрику, которая может получить
HttpContextBaseдля вас, так как вы всегда можете обернуть бетонаHttpContextнаHttpContextWrapper.