203

I started to convert my asp.net core RC1 project to RC2 and faced with problem that now IHttpContextAccessordoes 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?

Tseng
  • 57,187
  • 13
  • 181
  • 194
YuriyP
  • 3,852
  • 4
  • 24
  • 34

3 Answers3

313

IHttpContextAccessor is no longer wired up by default, you have to register it yourself

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
Joe Audette
  • 32,602
  • 11
  • 95
  • 97
  • 9
    It is worked. Also same story with `services.AddScoped()` – YuriyP May 22 '16 at 13:09
  • 7
    Do we have an official recommendation about what the proper scope is? Should it be `Singleton`, `Scoped` or `Transient`? – Mark Vincze Jun 14 '16 at 10:59
  • 11
    Ah it's discussed here, and multiple people verifies it can safely be `Singleton`. https://github.com/aspnet/Hosting/issues/793 – Mark Vincze Jun 14 '16 at 11:35
  • When doing that, I got this error : `InvalidOperationException: Cannot consume scoped service`. Any idea ? – Robouste Sep 23 '17 at 15:24
  • This is not solving the problem. I have deployed with both services.TryAddSingleton() and services.AddSingleton(); But both continue to return the same error. – jwize May 28 '18 at 20:53
  • Why is registered as singleton? – Ivan Montilla Feb 06 '19 at 18:27
  • because you only need one per application and it is non trivial to create one so you don't want to be creating it over and over – Joe Audette Feb 06 '19 at 19:16
  • 9
    Please see the next answer about using the provided extension method `services.AddHttpContextAccessor()` which is preferred/recommended by Microsoft. – Martin Bliss May 24 '20 at 03:30
202

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>();
SpruceMoose
  • 8,885
  • 4
  • 37
  • 52
0
services.AddScoped(sp => sp.GetService<IHttpContextAccessor>().HttpContext.Session);
Suraj Rao
  • 28,850
  • 10
  • 94
  • 99
  • 1
    While this code may solve the question, [including an explanation](//meta.stackexchange.com/q/114762) of how and why this solves the problem would really help to improve the quality of your post, and probably result in more up-votes. Remember that you are answering the question for readers in the future, not just the person asking now. Please [edit] your answer to add explanations and give an indication of what limitations and assumptions apply. – Suraj Rao Sep 13 '21 at 08:26