Il modo più semplice è ottenere l'applicazione ApplicationInstancee usare la sua Contextproprietà:
// 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' HttpContextBaseistanza che ti è stata consegnata è di tipo HttpContextWrapperin fase di esecuzione. L'esempio seguente mostra come è possibile farlo. Suppone che tu abbia un metodo chiamato Fooche accetta il contesto come HttpContextBasema 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) { /* ... */ }
HttpContextBaseha un metodo chiamato GetServicecome risultato del supporto IServiceProvider. L' GetServiceoverride dei HttpContextWrapperdelegati GetServiceall'implementazione HttpContextdell'istanza di wrapping . L' GetServiceimplementazione di HttpContextpermette di query per i soliti sospetti come HttpApplication, HttpRequest, HttpResponsee così via. Accade solo che HttpApplicationabbia una proprietà chiamata Context e che restituisca un'istanza di HttpContext. Così si arriva alla avvolto HttpContextesempio chiedendo HttpContextBaseper HttpApplicationvia GetServiceseguita dalla lettura della Contextproprietà del restituita HttpApplicationistanza.
Diversamente HttpContextBase, GetServicenon appare come un membro pubblico HttpContextma ciò è dovuto al fatto che HttpContextimplementa IServiceProvider.GetServiceesplicitamente mentre HttpContextBasenon lo fa.
Tieni presente che Foonon è più testabile perché si basa sulla capacità di scartare il sottostante HttpContextdurante 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.