wake-up-neo.com

Wie IHttpContextAccessor in der Startup-Klasse in der DI in ASP.NET Core 1.0 hinzufügen?

In ASP.NET Core RC 1 habe ich den folgenden Code verwendet, um den Wert des Kontexts (vollständige Adresse der Seite) abzurufen. Dann habe ich diesen Wert in der Konfiguration eingetragen.

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

Jetzt habe ich begonnen, das Projekt auf ASP.NET Core 1.0 zu aktualisieren. Aber beim Start der Seite erhalte ich folgende Fehlermeldung:

System.InvalidOperationException Der Dienst für den Typ "Microsoft.AspNetCore.Http.IHttpContextAccessor" konnte beim Versuch, "MyProject.Startup" zu aktivieren, nicht aufgelöst werden.

bei Microsoft.Extensions.Internal.ConstructorMatcher.CreateInstance (IServiceProvider-Anbieter) bei Microsoft.Extensions.Internal.ActivatorUtilities.CreateInstance (IServiceProvider-Anbieter, Typ instanceType, Object [] -Parameter) bei Microsoft.Extensions.Internal.ActivatorUtilities.Getance (IService Typ type) bei Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetServiceOrCreateInstance (IServiceProvider-Anbieter, Typ type) bei Microsoft.AspNetCore.Hosting.Internal.StartupLoader.LoadMethods (IServiceProvider-Dienste, Typ startupType, Zeichenfolge environmentName) bei Microsoft.A > c__DisplayClass1_0.b__1 (IServiceProvider sp) bei Microsoft.Extensions.DependencyInjection.ServiceLookup.FactoryService.Invoke (ServiceProvider-Anbieter) bei Microsoft.Extensions.DependencyInjection.ScopedCallSite.Invoke (ServiceProvider-Anbieter) bei Microsoft.Extensions.DependencyIn Anbieter) bei Microsoft.Extens ion_dependency_injection. <> c__DisplayClass12_0.b__0 (ServiceProvider-Anbieter) bei Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService (Typ serviceType) bei Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService (IService) .ServiceProviderServiceExtensions.GetRequiredService (IServiceProvider-Anbieter) bei Microsoft.AspNetCore.Hosting.Internal.WebHost.EnsureStartup () bei Microsoft.AspNetCore.Hosting.Internal.WebHost.EnsureApplicationServices () bei Microsoft.HostingNetCore

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

Wie erhalte ich die neue Version von IHttpContextAccessor beim Start der Anwendung?

19
Kolya_Net

Es ist kein Standarddienst mehr. Sie müssen es in Startup.cs konfigurieren

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

[~ # ~] Update [~ # ~] : In ASP.NET Core 2.1 die Hilfserweiterung AddHttpContextAccessor Methode wurde hinzugefügt, um das IHttpContextAccessor mit der korrekten Lebensdauer (Singleton) korrekt zu registrieren. Daher sollte der Code in ASP.NET Core 2.1 und höher sein

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

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

61