2016-07-04 3 views
7

ASP.NET 핵심 RC 1에서는 다음 코드를 사용하여 컨텍스트 (페이지의 전체 주소) 값을 검색했습니다. 그런 다음이 값을 구성에 기록했습니다.ASP.NET Core 1.0 DI의 Startup 클래스에 IHttpContextAccessor를 추가하는 방법은 무엇입니까?

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

이제 ASP.NET Core 1.0에서 프로젝트를 업데이트하기 시작했습니다. 하지만 다음과 같은 오류가 사이트의 발사시 :

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

어떻게 응용 프로그램 시작시 IHttpContextAccessor 새 버전을받을 수 있나요?

+3

, 당신은 IHttpContextAccessor'이 더 이상'볼 수 있습니다 기본적으로 등록됩니다. https://github.com/aspnet/Hosting/issues/793 – DavidG

+0

@DavidG 링크를 제공해 주셔서 감사합니다. –

답변

17

더 이상 기본 서비스가 아닙니다. 당신은 UPDATE

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

Startup.cs

에 구성해야합니다 : ASP.NET 코어 2.1, the AddHttpContextAccessor helper extension method가 제대로 올바른 수명 (싱글)로 IHttpContextAccessor를 등록 하였다. 그래서, 위의 ASP.NET 코어 2.1에서 코드가 있어야한다

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

출처 : 당신이 닷넷 코어에 대한 주요 변경 보면 https://github.com/aspnet/Hosting/issues/793

+2

공식 발표 : https://github.com/aspnet/Announcements/issues/190 – MartinHN

+0

종속성 추가하기 'Startap.cs'는 클래스 생성자에서'IHttpContextAccessor'를 사용해야하기 때문에 제 문제를 해결하지 못합니다. 그래서'Program.cs'에 의존성을 추가했습니다. –

+2

하나의 질문이 요청을 위해있을 것이기 때문에 이것이 'AddTransient'가 아니어야합니까? – Ruchan

관련 문제