Cara paling sederhana adalah mendapatkan aplikasi ApplicationInstance
,, dan menggunakan Context
propertinya:
// httpContextBase is of type HttpContextBase
HttpContext context = httpContextBase.ApplicationInstance.Context;
(Terima kasih kepada Ismail Smyrnow yang mencatat ini di komentar)
Jawaban asli:
Anda dapat melakukannya, terutama jika HttpContextBase
instance yang Anda terima adalah tipe HttpContextWrapper
saat run-time. Contoh berikut menggambarkan bagaimana Anda bisa melakukan ini. Itu mengandaikan Anda memiliki metode yang disebut Foo
yang menerima konteks sebagai HttpContextBase
tetapi kemudian perlu memanggil metode dalam majelis pihak ketiga (bahwa Anda mungkin tidak memiliki nasib baik untuk dimodifikasi) yang mengharapkan konteks yang akan diketikkan 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
memiliki metode yang disebut GetService
sebagai hasil dari pendukung IServiceProvider
. The GetService
override dari HttpContextWrapper
delegasi ke GetService
pelaksanaan dibungkus HttpContext
misalnya. The GetService
pelaksanaan HttpContext
memungkinkan Anda untuk permintaan untuk tersangka seperti HttpApplication
, HttpRequest
, HttpResponse
dan sebagainya. Kebetulan yang HttpApplication
memiliki properti yang disebut Konteks dan yang mengembalikan contoh HttpContext
. Jadi satu mendapat di dibungkus HttpContext
misalnya dengan meminta HttpContextBase
untuk HttpApplication
melalui GetService
diikuti dengan membaca Context
milik kembali HttpApplication
contoh.
Tidak seperti HttpContextBase
, GetService
tidak muncul sebagai anggota publik HttpContext
tetapi itu karena HttpContext
mengimplementasikan IServiceProvider.GetService
kejelasan sementara HttpContextBase
tidak.
Ingatlah bahwa Foo
tidak lagi dapat diuji karena bergantung pada kemampuan untuk membuka bungkus yang mendasarinya HttpContext
selama pengujian dan yang hampir tidak mungkin dipalsukan / rintisan. Inti dari jawaban ini, bagaimanapun, adalah untuk menjawab pertanyaan, "Bagaimana saya mendapatkan objek HttpContext dari HttpContextBase?", Secara harfiah . Teknik yang diilustrasikan berguna dalam situasi-situasi di mana Anda menemukan diri Anda terjepit di antara komponen yang tidak perlu Anda modifikasi.
context.ApplicationInstance.Context
?Http*Base
variasi yang dikembalikan olehHttpContextBase
. : P Saya akan memperbarui jawabannya.Kamu bisa,
sumber
Kamu tidak bisa
Seluruh tujuan
HttpContextBase
adalah untuk menghilangkan ketergantungan padaHttpContext
kelas konkret . Meskipun mungkin mengandung betonHttpContext
(seperti halnya denganhttpContextWrapper
) , implementasi lain mungkin sama sekali tidak ada hubungannyaHttpContext
.Pilihan terbaik Anda adalah menentukan Pabrik Abstrak kustom yang bisa mendapatkan
HttpContextBase
untuk Anda, karena Anda selalu dapat membungkus betonHttpContext
dalamHttpContextWrapper
.sumber
IHttpHandler
implementasi Anda akhirnya Anda harus memasukkan sejumlah abstraksi di (pembungkus Respon) hanya untuk tes unit Anda, yang tidak terasa benar tetapi akhirnya menjadi satu-satunya pilihan.