Andrei benar - nilainya null karena saat berjalan di bawah kerangka kerja ASP.NET MVC, HttpContext (dan karenanya HttpContext.Session) tidak disetel saat kelas pengontrol dibuat seperti yang Anda harapkan, tetapi disetel ("diinjeksi") nanti oleh kelas ControllerBuilder. Jika Anda ingin pemahaman yang lebih baik tentang siklus hidup Anda dapat menarik kerangka kerja ASP.NET MVC (sumber tersedia), atau merujuk ke: halaman ini
Jika Anda perlu mengakses Sesi, salah satu cara adalah dengan menimpa metode "OnActionExecuting" dan mengaksesnya di sana, karena akan tersedia pada saat itu.
Namun, seperti yang disarankan Andrei, jika kode Anda bergantung pada Sesi maka akan berpotensi sulit untuk menulis pengujian unit, jadi mungkin Anda dapat mempertimbangkan untuk menggabungkan Sesi dalam kelas pembantu yang kemudian dapat ditukar dengan yang berbeda, non- versi web saat menjalankan pengujian unit, oleh karena itu lepaskan pengontrol Anda dari web.
Selain jawaban lain di sini, meskipun
Controller.Session
tidak diisi di konstruktor, Anda masih dapat mengakses sesi melalui:System.Web.HttpContext.Current.Session
dengan peringatan standar bahwa hal ini berpotensi mengurangi kemampuan pengujian pengontrol Anda.
sumber
System.Web.HttpContext.Current.Session
juganull
di instanciator VS2019 MVC.Sesi disuntikkan nanti dalam siklus hidup. Mengapa Anda membutuhkan sesi dalam konstruktor? Jika Anda membutuhkannya untuk TDD, Anda harus membungkus sesi menjadi objek yang dapat dipermainkan.
sumber
Anda dapat mengganti metode Inisialisasi untuk menyetel sesi Anda.
protected override void Initialize(RequestContext requestContext)
sumber
Jika Anda menggunakan Wadah IoC, coba masukkan dan gunakan
HttpSessionStateBase
alih - alihSession
objek:private static Container defaultContainer() { return new Container(ioc => { // session manager setup ioc.For<HttpSessionStateBase>() .Use(ctx => new HttpSessionStateWrapper(HttpContext.Current.Session)); }); }
sumber
Jawaban ini mungkin bermanfaat bagi sebagian orang
Jika kita mengganti metode Inisialisasi maka kita harus menginisialisasi kelas dasar dengan konteks permintaan: base.Initialize (requestContext);
protected override void Initialize(RequestContext requestContext) { base.Initialize(requestContext); }
sumber
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
.