InvalidOperationException: impossibile risolvere il servizio per il tipo "Microsoft.AspNetCore.Http.IHttpContextAccessor"


137

Ho iniziato a convertire il mio progetto RC1 core asp.net in RC2 e ho riscontrato un problema che ora IHttpContextAccessornon si è risolto.

Per semplicità ho creato un nuovo progetto ASP.NET RC2 usando Visual Studio Template ASP.NET Core Web Application (.Net Framework). Poi ho aggiunto costruttore per HomeController quale modello creato per me.

public HomeController(IHttpContextAccessor accessor)
{
}

E dopo aver avviato l'applicazione ricevo il prossimo errore:

InvalidOperationException: impossibile risolvere il servizio per il tipo "Microsoft.AspNetCore.Http.IHttpContextAccessor" durante il tentativo di attivare "TestNewCore.Controllers.HomeController". in Microsoft.Extensions.Internal.ActivatorUtilities.GetService (IServiceProvider sp, Tipo di tipo, Tipo richiesto Da, Booleano isDefaultParameterRequired)

Nella mia applicazione reale ho bisogno di risolvere IHttpContextAccessornella mia classe di servizio per ottenere l'accesso a _contextAccessor.HttpContext.Authenticatione _contextAccessor.HttpContext.User. Everething funziona bene in RC1. Quindi come può essere in RC2?


Questo problema è stato discusso sul repository aspit GitHub qui: github.com/aspnet/Hosting/issues/793
Chris Pickford,

Risposte:


217

IHttpContextAccessor non è più cablato per impostazione predefinita, è necessario registrarlo da soli

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();

7
Ha funzionato. Anche la stessa storia conservices.AddScoped<IActionContextAccessor, ActionContextAccessor>()
YuriyP,

6
Abbiamo una raccomandazione ufficiale su quale sia l'ambito adeguato? Dovrebbe essere Singleton, Scopedo Transient?
Mark Vincze,

9
Ah, è discusso qui, e più persone verificano che possa essere sicuro Singleton. github.com/aspnet/Hosting/issues/793
Mark Vincze

Nel fare questo, ho ottenuto questo errore: InvalidOperationException: Cannot consume scoped service. Qualche idea ?
Robouste,

1
Vedere la risposta successiva sull'utilizzo del metodo di estensione fornito services.AddHttpContextAccessor()che è preferito / consigliato da Microsoft.
Martin Bliss,

120

A partire da .NET Core 2.1 esiste un metodo di estensione che è stato aggiunto per registrare correttamente IHttpContextAccessorun singleton. Vedere Aggiungi helper per registrare IHttpContextAccessor # 947 . Aggiungi semplicemente come segue nel tuo ConfigureServices()metodo:

services.AddHttpContextAccessor();

Ciò equivale a:

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.