InvalidOperationException: 'Microsoft.AspNetCore.Http.IHttpContextAccessor' türü için hizmet çözülemedi


137

Asp.net çekirdek RC1 projemi RC2'ye dönüştürmeye başladım ve şimdi IHttpContextAccessorçözülemeyen bir sorunla karşılaştım .

Basitlik için Visual Studio Template kullanarak yeni ASP.NET RC2 projesi oluşturdum ASP.NET Core Web Application (.Net Framework). Daha sonra HomeController için yapıcıyı hangi şablonun benim için oluşturduğunu ekledim.

public HomeController(IHttpContextAccessor accessor)
{
}

Ve uygulamayı başlattıktan sonra bir sonraki hata alıyorum:

InvalidOperationException: 'TestNewCore.Controllers.HomeController' etkinleştirilmeye çalışılırken 'Microsoft.AspNetCore.Http.IHttpContextAccessor' türü için hizmet çözülemedi. в Microsoft.Extensions.Internal.ActivatorUtilities.GetService (IServiceProvider sp, Tür türü, Gerekli türBy, Boolean isDefaultParameterRequired)

Gerçek uygulamamda IHttpContextAccessorerişim sağlamak için kendi hizmet sınıfımda çözmem _contextAccessor.HttpContext.Authenticationgerekiyor _contextAccessor.HttpContext.User. RC1'de her şey yolunda gidiyor. Peki RC2'de nasıl olabilir?


Bu sorun buradan aspnet GitHub deposunda tartışıldı: github.com/aspnet/Hosting/issues/793
Chris Pickford

Yanıtlar:


217

IHttpContextAccessor artık varsayılan olarak bağlanmamıştır, kendiniz kaydetmeniz gerekir

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();

7
Çalıştı. Ayrıca aynı hikayeservices.AddScoped<IActionContextAccessor, ActionContextAccessor>()
YuriyP

6
Uygun kapsamın ne olduğu konusunda resmi bir tavsiyemiz var mı? Olmalı mı Singleton, Scopedyoksa Transient?
Mark Vincze

9
Ah burada tartışıldı ve birden fazla kişi güvenli bir şekilde olabileceğini doğruladı Singleton. github.com/aspnet/Hosting/issues/793
Mark Vincze

Bunu yaparken bu hata var: InvalidOperationException: Cannot consume scoped service. Herhangi bir fikir ?
Robouste

1
Lütfen services.AddHttpContextAccessor()Microsoft tarafından tercih edilen / önerilen sağlanan uzantı yöntemini kullanma ile ilgili bir sonraki cevaba bakın .
Martin Bliss

120

.NET Core 2.1'den itibaren IHttpContextAccessor, bir singleton olarak doğru bir şekilde kaydetmek için eklenmiş bir uzantı yöntemi vardır . Bkz . IHttpContextAccessor # 947'yi kaydetmek için yardımcı ekleme . Sadece ConfigureServices()yönteminize aşağıdaki gibi ekleyin :

services.AddHttpContextAccessor();

Bu şuna eşittir:

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.