Saya perlu mengakses arus HttpContext
dalam metode statis atau layanan utilitas.
Dengan ASP.NET MVC klasik dan System.Web
, saya hanya akan menggunakan HttpContext.Current
untuk mengakses konteks secara statis. Tetapi bagaimana saya melakukan ini di ASP.NET Core?
c#
asp.net-core
maxswitcher
sumber
sumber
IHttpContextAccessor
hanya akan tersedia di tempat-tempat di mana wadah DI sedang menyelesaikan instance.CallContextServiceLocator
untuk menyelesaikan layanan, bahkan dari contoh non-DI-disuntikkan:CallContextServiceLocator.Locator.ServiceProvider.GetService<IHttpContextAccessor>()
. Dalam praktiknya, ini adalah hal yang hebat jika Anda bisa menghindarinya :)Necromancing.
YA ANDA BISA
Tip rahasia untuk mereka yang bermigrasi besar
jungpotongan (sigh, Freudian slip) dari kode.Metode berikut ini adalah serangan jahat dari peretasan yang secara aktif terlibat dalam melaksanakan pekerjaan ekspres setan (di mata pengembang kerangka .NET Core), tetapi berfungsi :
Di
public class Startup
tambahkan properti
Dan kemudian tambahkan IHttpContextAccessor tunggal ke DI di ConfigureServices.
Kemudian di Configure
tambahkan Parameter DI
IServiceProvider svp
, sehingga metodenya seperti:Selanjutnya, buat kelas pengganti untuk System.Web:
Sekarang di Konfigurasi, di mana Anda menambahkan
IServiceProvider svp
, simpan penyedia layanan ini ke variabel statis "ServiceProvider" di System.Web.HttpContext kelas baru saja dibuat (System.Web.HttpContext.ServiceProvider)dan atur HostingEnvironment.Hosted ke true
ini pada dasarnya apa yang dilakukan System.Web, hanya saja Anda tidak pernah melihatnya (saya kira variabel tersebut dinyatakan sebagai internal, bukan publik).
Seperti di ASP.NET Web-Forms, Anda akan mendapatkan NullReference ketika Anda mencoba mengakses HttpContext ketika tidak ada, seperti dulu
Application_Start
di global.asax.Saya tekankan lagi, ini hanya berfungsi jika Anda benar-benar menambahkan
seperti yang saya tulis Anda harus.
Selamat datang di pola ServiceLocator dalam pola DI;)
Untuk risiko dan efek samping, tanyakan dokter atau apoteker Anda - atau pelajari sumber .NET Core di github.com/aspnet , dan lakukan beberapa pengujian.
Mungkin metode yang lebih bisa dipertahankan adalah menambahkan kelas pembantu ini
Dan kemudian memanggil HttpContext.Configure di Startup-> Configure
sumber
Hanya untuk menambah jawaban lain ...
Dalam ASP.NET Inti 2.1, ada yang
AddHttpContextAccessor
metode ekstensi , yang akan mendaftarkanIHttpContextAccessor
dengan seumur hidup yang benar:sumber
Cara paling sah yang saya lakukan adalah dengan menyuntikkan IHttpContextAccessor dalam implementasi statis Anda sebagai berikut:
Kemudian menugaskan IHttpContextAccessor di Konfigurasi Startup harus melakukan pekerjaan.
Saya kira Anda juga harus mendaftarkan layanan singleton:
sumber
Menurut artikel ini: Mengakses HttpContext di luar komponen kerangka kerja di ASP.NET Core
Kemudian:
Kemudian:
Anda bisa menggunakannya seperti ini:
sumber
Di Startup
Di Kontroler
sumber