InvalidOperationException: impossible de résoudre le service pour le type «Microsoft.AspNetCore.Http.IHttpContextAccessor»

137

J'ai commencé à convertir mon projet principal asp.net RC1 en RC2 et j'ai rencontré un problème qui IHttpContextAccessorne s'est pas résolu.

Par souci de simplicité, j'ai créé un nouveau projet ASP.NET RC2 à l'aide du modèle Visual Studio ASP.NET Core Web Application (.Net Framework). Ensuite, j'ai ajouté un constructeur pour HomeController, modèle créé pour moi.

public HomeController(IHttpContextAccessor accessor)
{
}

Et après avoir lancé l'application, je reçois l'erreur suivante:

InvalidOperationException: impossible de résoudre le service pour le type «Microsoft.AspNetCore.Http.IHttpContextAccessor» lors de la tentative d'activation de «TestNewCore.Controllers.HomeController». Microsoft.Extensions.Internal.ActivatorUtilities.GetService (IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired)

Dans ma vraie application, je dois résoudre IHttpContextAccessordans ma propre classe de service pour accéder à _contextAccessor.HttpContext.Authenticationet à _contextAccessor.HttpContext.User. Everething fonctionne bien dans RC1. Alors, comment peut-il supposer être dans RC2?

YuriyP
la source
Ce problème a été discuté sur le référentiel aspnet GitHub ici: github.com/aspnet/Hosting/issues/793
Chris Pickford

Réponses:

217

IHttpContextAccessor n'est plus câblé par défaut, vous devez l'enregistrer vous-même

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
Joe Audette
la source
7
C'est travaillé. Aussi même histoire avecservices.AddScoped<IActionContextAccessor, ActionContextAccessor>()
YuriyP
6
Avons-nous une recommandation officielle sur la portée appropriée? Doit-il l'être Singleton, Scopedou Transient?
Mark Vincze
9
Ah, c'est discuté ici, et plusieurs personnes vérifient que cela peut être en toute sécurité Singleton. github.com/aspnet/Hosting/issues/793
Mark Vincze
Quand vous faites cela, je suis arrivé cette erreur: InvalidOperationException: Cannot consume scoped service. Une idée ?
Robouste
1
Veuillez consulter la réponse suivante sur l'utilisation de la méthode d'extension fournie services.AddHttpContextAccessor()qui est préférée / recommandée par Microsoft.
Martin Bliss
120

À partir de .NET Core 2.1, une méthode d'extension a été ajoutée pour enregistrer correctement un en IHttpContextAccessortant que singleton. Voir Ajouter un assistant pour enregistrer IHttpContextAccessor # 947 . Ajoutez simplement ce qui suit dans votre ConfigureServices()méthode:

services.AddHttpContextAccessor();

Cela équivaut à:

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
CalC
la source