2016-07-04 19 views
7

In ASP.NET Core RC 1 ho utilizzato il seguente codice per recuperare il valore del contesto (indirizzo completo della pagina). Quindi ho registrato questo valore nella configurazione.Come aggiungere IHttpContextAccessor nella classe Startup nel DI in ASP.NET Core 1.0?

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

Ora ho iniziato ad aggiornare il progetto su ASP.NET Core 1.0. Ma durante il lancio del sito ricevo il seguente errore:

System.InvalidOperationException Unable to resolve service for type 'Microsoft.AspNetCore.Http.IHttpContextAccessor' while attempting to activate 'MyProject.Startup'.

at Microsoft.Extensions.Internal.ConstructorMatcher.CreateInstance(IServiceProvider provider) at Microsoft.Extensions.Internal.ActivatorUtilities.CreateInstance(IServiceProvider provider, Type instanceType, Object[] parameters) at Microsoft.Extensions.Internal.ActivatorUtilities.GetServiceOrCreateInstance(IServiceProvider provider, Type type) at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetServiceOrCreateInstance(IServiceProvider provider, Type type) at Microsoft.AspNetCore.Hosting.Internal.StartupLoader.LoadMethods(IServiceProvider services, Type startupType, string environmentName) at Microsoft.AspNetCore.Hosting.<>c__DisplayClass1_0.b__1(IServiceProvider sp) at Microsoft.Extensions.DependencyInjection.ServiceLookup.FactoryService.Invoke(ServiceProvider provider) at Microsoft.Extensions.DependencyInjection.ScopedCallSite.Invoke(ServiceProvider provider) at Microsoft.Extensions.DependencyInjection.SingletonCallSite.Invoke(ServiceProvider provider) at Microsoft.Extensions.DependencyInjection.<>c__DisplayClass12_0.b__0(ServiceProvider provider) at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType) at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider) at Microsoft.AspNetCore.Hosting.Internal.WebHost.EnsureStartup() at Microsoft.AspNetCore.Hosting.Internal.WebHost.EnsureApplicationServices() at Microsoft.AspNetCore.Hosting.Internal.WebHost.BuildApplication()

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

Come faccio ad avere la nuova versione IHttpContextAccessor durante l'avvio dell'applicazione?

+3

Se si guardano le modifiche rottura per NET core, si può vedere che 'IHttpContextAccessor' non è più registrato per impostazione predefinita. https://github.com/aspnet/Hosting/issues/793 – DavidG

+0

@DavidG Grazie mille per il collegamento. –

risposta

17

Non è più un servizio predefinito. È necessario configurarlo in Startup.cs

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

UPDATE: In ASP.NET 2.1 core, the AddHttpContextAccessor helper extension method stato aggiunto al registrare correttamente il IHttpContextAccessor con la durata corretta (Singleton). Così, in ASP.NET core 2.1 e superiori, il codice dovrebbe essere

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

Fonte: https://github.com/aspnet/Hosting/issues/793

+2

Annuncio ufficiale: https://github.com/aspnet/Announcements/issues/190 – MartinHN

+0

L'aggiunta di dipendenze 'Startap.cs' non risolve il mio problema perché' IHttpContextAccessor' deve essere usato nel costruttore della classe. Così ho aggiunto una dipendenza nel 'Program.cs' –

+2

una domanda non dovrebbe essere questo' AddTransient' perché sarà per una richiesta? – Ruchan

Problemi correlati