InvalidOperationException: Tidak dapat menyelesaikan layanan untuk tipe 'Microsoft.AspNetCore.Http.IHttpContextAccessor'

137

Saya mulai mengubah proyek asp.net core RC1 saya ke RC2 dan dihadapkan dengan masalah yang sekarang IHttpContextAccessortidak terselesaikan.

Demi kesederhanaan, saya membuat proyek ASP.NET RC2 baru menggunakan Visual Studio Template ASP.NET Core Web Application (.Net Framework). Kemudian saya menambahkan konstruktor untuk HomeController yang template dibuat untuk saya.

public HomeController(IHttpContextAccessor accessor)
{
}

Dan setelah saya memulai aplikasi saya menerima kesalahan berikutnya:

InvalidOperationException: Tidak dapat menyelesaikan layanan untuk tipe 'Microsoft.AspNetCore.Http.IHttpContextAccessor' ketika mencoba mengaktifkan 'TestNewCore.Controllers.HomeController'. в Microsoft.Extensions.Internal.ActivatorUtilities.GetService (IServiceProvider sp, Jenis tipe, Jenis yang diperlukan oleh, Boolean adalah DefaultParameter Diperlukan)

Dalam aplikasi asli saya, saya perlu menyelesaikan IHttpContextAccessordi kelas layanan saya sendiri untuk mendapatkan akses ke _contextAccessor.HttpContext.Authenticationdan ke _contextAccessor.HttpContext.User. Everething berfungsi dengan baik di RC1. Jadi bagaimana bisa di RC2?

YuriyP
sumber
Masalah ini telah dibahas pada repositori aspnet GitHub di sini: github.com/aspnet/Hosting/issues/793
Chris Pickford

Jawaban:

217

IHttpContextAccessor tidak lagi terhubung secara default, Anda harus mendaftarkannya sendiri

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
Joe Audette
sumber
7
Itu berhasil. Juga cerita yang sama denganservices.AddScoped<IActionContextAccessor, ActionContextAccessor>()
YuriyP
6
Apakah kita memiliki rekomendasi resmi tentang ruang lingkup yang tepat? Haruskah demikian Singleton, Scopedatau Transient?
Mark Vincze
9
Ah itu dibahas di sini, dan banyak orang memverifikasi itu bisa dilakukan dengan aman Singleton. github.com/aspnet/Hosting/issues/793
Mark Vincze
Ketika melakukan itu, saya punya kesalahan ini: InvalidOperationException: Cannot consume scoped service. Ada ide ?
Robouste
1
Silakan lihat jawaban berikutnya tentang menggunakan metode ekstensi yang disediakan services.AddHttpContextAccessor()yang disukai / direkomendasikan oleh Microsoft.
Martin Bliss
120

Pada. NET Core 2.1 ada metode ekstensi yang telah ditambahkan untuk mendaftar dengan benar IHttpContextAccessorsebagai singleton. Lihat Menambahkan pembantu untuk mendaftar IHttpContextAccessor # 947 . Cukup tambahkan sebagai berikut dalam ConfigureServices()metode Anda :

services.AddHttpContextAccessor();

Ini setara dengan:

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
CalC
sumber