it-swarm.dev

ASP.NET Core 1.0에서 DI의 Startup 클래스에 IHttpContextAccessor를 추가하는 방법은 무엇입니까?

ASP.NET Core RC 1에서는 다음 코드를 사용하여 컨텍스트 값 (페이지의 전체 주소)을 검색했습니다. 그런 다음이 값을 구성에 기록했습니다.

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 'MyProject.Startup'을 활성화하는 동안 'Microsoft.AspNetCore.Http.IHttpContextAccessor'유형에 대한 서비스를 확인할 수 없습니다.

microsoft.Extensions.Internal.ConstructorMatcher.CreateInstance (IServiceProvider provider)의 Microsoft.Extensions.Internal.ActivatorUtilities.CreateInstance (IServiceProvider provider, Type instanceType, Object [] parameters)의 Microsoft.Extensions.Internal.ActivatorUtilities.GetServiceOrCreateInstance (IServiceProvider 제공자, Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetServiceOrCreateInstance (IServiceProvider provider, Type type)의 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. < Microsoft.Extensions.DependencyInjection.ServiceLookup.FactoryService.Invoke (ServiceProvider provider)의 Microsoft.Extensions.DependencyInjection.ScopedCallSite.Invoke (ServiceProvider provider)의 Microsoft.Extensions.DependencyInjection.SingletonCallSite.에서> c__DisplayClass1_0.b__1 (IServiceProvider sp) 공급자)는 Microsoft.Extens에 있습니다. Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService (Type serviceType) at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService (IServiceProvider provider, Type serviceType) Microsoft.Extensions. <ionsc.DependencyInjection. <> c__DisplayClass12_0.b__0 (서비스 공급자 제공자) Microsoft.AspNetCore.Hosting.Internal.WebHost.EnsureStartup ()의 Microsoft.AspNetCore.Hosting.Internal.WebHost.EnsureApplicationServices ()의 Microsoft.AspNetCore.Hosting.Internal.WebHost.BuildApplication ()의 .ServiceProviderServiceExtensions.GetRequiredService (IServiceProvider provider)

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

응용 프로그램을 시작하는 동안 새 버전 IHttpContextAccessor를 얻으려면 어떻게해야합니까?

19
Kolya_Net

더 이상 기본 서비스가 아닙니다. Startup.cs에서 구성해야합니다.

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

[~ # ~] update [~ # ~] : ASP.NET Core 2.1에서 AddHttpContextAccessor 도우미 확장 methodIHttpContextAccessor을 (를) 올바른 수명 (단일)으로 올바르게 등록하기 위해 추가되었습니다. 따라서 ASP.NET Core 2.1 이상에서 코드는

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

출처 : https://github.com/aspnet/Hosting/issues/79

61