Il modo più semplice è ottenere l'applicazione ApplicationInstance
e usare la sua Context
proprietà:
// httpContextBase is of type HttpContextBase
HttpContext context = httpContextBase.ApplicationInstance.Context;
(grazie a Ishmael Smyrnow che lo ha notato nei commenti)
Risposta originale:
Puoi, specialmente se l' HttpContextBase
istanza che ti è stata consegnata è di tipo HttpContextWrapper
in fase di esecuzione. L'esempio seguente mostra come è possibile farlo. Suppone che tu abbia un metodo chiamato Foo
che accetta il contesto come HttpContextBase
ma che quindi deve chiamare un metodo in un assembly di terze parti (che potresti non avere la fortuna di modificare) che si aspetta che il contesto venga digitato come 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
ha un metodo chiamato GetService
come risultato del supporto IServiceProvider
. L' GetService
override dei HttpContextWrapper
delegati GetService
all'implementazione HttpContext
dell'istanza di wrapping . L' GetService
implementazione di HttpContext
permette di query per i soliti sospetti come HttpApplication
, HttpRequest
, HttpResponse
e così via. Accade solo che HttpApplication
abbia una proprietà chiamata Context e che restituisca un'istanza di HttpContext
. Così si arriva alla avvolto HttpContext
esempio chiedendo HttpContextBase
per HttpApplication
via GetService
seguita dalla lettura della Context
proprietà del restituita HttpApplication
istanza.
Diversamente HttpContextBase
, GetService
non appare come un membro pubblico HttpContext
ma ciò è dovuto al fatto che HttpContext
implementa IServiceProvider.GetService
esplicitamente mentre HttpContextBase
non lo fa.
Tieni presente che Foo
non è più testabile perché si basa sulla capacità di scartare il sottostante HttpContext
durante il test e che è quasi impossibile da falsificare / stub in primo luogo. Il punto di questa risposta, tuttavia, è di rispondere alla domanda "Come posso ottenere un oggetto HttpContext da HttpContextBase?", Letteralmente . La tecnica illustrata è utile in quelle situazioni in cui ti trovi inserito tra componenti che non hai necessariamente il lusso di modificare.