I started to convert my asp.net core RC1 project to RC2 and faced with problem that now IHttpContextAccessor
does not resolved.
For sake of simplicity I created new ASP.NET RC2 project using Visual Studio Template ASP.NET Core Web Application (.Net Framework)
. Than I added constructor for HomeController which template created for me.
public HomeController(IHttpContextAccessor accessor)
{
}
And after I start application I receive next error:
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)
In my real application I need to resolve IHttpContextAccessor
in my own service class for getting access to _contextAccessor.HttpContext.Authentication
and to _contextAccessor.HttpContext.User
. Everething works fine in RC1. So how can it suppose to be in RC2?
IHttpContextAccessor is no longer wired up by default, you have to register it yourself
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
As of .NET Core 2.1 there is an extension method that has been added to correctly register an IHttpContextAccessor
as a singleton. See Add helper to register IHttpContextAccessor #947. Simply add as follows in your ConfigureServices()
method:
services.AddHttpContextAccessor();
This is equivalent to:
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddScoped(sp => sp.GetService<IHttpContextAccessor>().HttpContext.Session);
Success story sharing
services.AddScoped<IActionContextAccessor, ActionContextAccessor>()
Singleton
,Scoped
orTransient
?Singleton
. github.com/aspnet/Hosting/issues/793InvalidOperationException: Cannot consume scoped service
. Any idea ?services.AddHttpContextAccessor()
which is preferred/recommended by Microsoft.