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?


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>();

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>();
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.