2016-05-22 10 views
45

Ho iniziato a convertire il mio RC1 di asp.net core in RC2 e ho riscontrato problemi che ora non risolvono lo IHttpContextAccessor.InvalidOperationException: impossibile risolvere il servizio per tipo "Microsoft.AspNetCore.Http.IHttpContextAccessor"

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

public HomeController(IHttpContextAccessor accessor) 
{ 
} 

E dopo comincio applicazione ricevo prossimo errore:

InvalidOperationException: Unable to resolve service for type 'Microsoft.AspNetCore.Http.IHttpContextAccessor' while attempting to activate 'TestNewCore.Controllers.HomeController'. в Microsoft.Extensions.Internal.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired)

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

risposta

79

IHttpContextAccessor non è cablato per impostazione predefinita, è necessario registrarsi da soli

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 
+5

Si è lavorato. La stessa storia con 'services.AddScoped ()' – YuriyP

+2

Abbiamo una raccomandazione ufficiale su quale sia l'ambito corretto? Dovrebbe essere 'Singleton',' Scoped' o 'Transient'? –

+5

Ah è discusso qui, e più persone verificano che possa tranquillamente essere "Singleton". https://github.com/aspnet/Hosting/issues/793 –

3

Come di .NET 2.1 Nucleo v'è un metodo di estensione che è stato aggiunto per registrare correttamente un IHttpContextAccessor come Singleton. Vedi Add helper to register IHttpContextAccessor #947. Basta aggiungere la seguente nel metodo ConfigureServices():

services.AddHttpContextAccessor(); 

Ciò equivale a:

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 
Problemi correlati