web-dev-qa-db-fra.com

Comment ajouter IHttpContextAccessor dans la classe de démarrage dans le DI dans ASP.NET Core 1.0?

Dans ASP.NET Core RC 1, j'ai utilisé le code suivant pour récupérer la valeur du contexte (adresse complète de la page). J'ai ensuite enregistré cette valeur dans la configuration.

public class Startup
{
        public IConfigurationRoot Configuration { get; set; }
        private IHostingEnvironment CurrentEnvironment { get; set; }
        private IHttpContextAccessor HttpContextAccessor { get; set; }
        public Startup(IHostingEnvironment env,
                IHttpContextAccessor httpContextAccessor)
            {                
                var builder = new ConfigurationBuilder()
                    .SetBasePath(env.ContentRootPath)
                    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);

                if (env.IsDevelopment())
                {
                    builder.AddUserSecrets();
                }
                builder.AddEnvironmentVariables();
                Configuration = builder.Build();
                CurrentEnvironment = env;
                HttpContextAccessor = httpContextAccessor;
            }
        public void ConfigureServices(IServiceCollection services)
        {
        ...

        services.AddOptions();
        services.Configure<WebAppSettings>(configuration);
        services.Configure<WebAppSettings>(settings =>
        {
            ...
            settings.WebRootPath = CurrentEnvironment.WebRootPath;
            settings.DomainUrl = HttpContextAccessor.HttpContext.Request.Host.ToUriComponent();
        });
        }
   }

Maintenant, j'ai commencé à mettre à jour le projet sur ASP.NET Core 1.0. Mais lors du lancement du site j'obtiens l'erreur suivante:

System.InvalidOperationException Impossible de résoudre le service pour le type "Microsoft.AspNetCore.Http.IHttpContextAccessor" lors de la tentative d'activation de "MyProject.Startup".

chez Microsoft.Extensions.Internal.ConstructorMatcher.CreateInstance (fournisseur IServiceProvider) chez Microsoft.Extensions.Internal.ActivatorUtilities.CreateInstance (fournisseur IServiceProvider, type instanceType, paramètres Object []) chez Microsoft.Extensions.Internal.ActivatorUtilities.GetServiceOriceInerviceOrServe Type type) chez Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetServiceOrCreateInstance (fournisseur IServiceProvider, Type type) chez Microsoft.AspNetCore.Hosting.Internal.StartupLoader.LoadMethods (IServiceProvider services, Type startupType, string environmentName) chez Microsoft.A. > c__DisplayClass1_0.b__1 (IServiceProvider sp) sur Microsoft.Extensions.DependencyInjection.ServiceLookup.FactoryService.Invoke (fournisseur ServiceProvider) sur Microsoft.Extensions.DependencyInjection.ScopedCallSite.Invoke (fournisseur ServiceProvider) sur Microsoft.Extensions.InxtService.InxtService.Inxtection.Dev fournisseur) chez Microsoft.Extens ions.DependencyInjection. <> c__DisplayClass12_0.b__0 (fournisseur ServiceProvider) chez Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService (Type serviceType) chez Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredServiceService TypeService TypeServiceService TypeFournisseur de services (IService) .ServiceProviderServiceExtensions.GetRequiredService (fournisseur IServiceProvider) sur Microsoft.AspNetCore.Hosting.Internal.WebHost.EnsureStartup () sur Microsoft.AspNetCore.Hosting.Internal.WebHost.EnsureApplicationServices () sur Microsoft.Aspec.InfoApp

.NET Framework X64 v4.0.30319.42000 | Microsoft.AspNetCore.Hosting version 1.0.0-rtm-21431 | Microsoft Windows 6.1.7601 S

Comment obtenir la nouvelle version IHttpContextAccessor lors du démarrage de l'application?

19
Kolya_Net

Ce n'est plus un service par défaut. Vous devez le configurer dans Startup.cs

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>();

[~ # ~] mise à jour [~ # ~] : Dans ASP.NET Core 2.1, l'extension d'assistance AddHttpContextAccessor a été ajoutée pour enregistrer correctement le IHttpContextAccessor avec la durée de vie correcte (singleton). Ainsi, dans ASP.NET Core 2.1 et supérieur, le code doit être

services.AddHttpContextAccessor();
services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>();

Source: https://github.com/aspnet/Hosting/issues/79

61
Oleksandr Fentsyk