web-dev-qa-db-ja.com

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)at Microsoft.Extensions.Internal.ActivatorUtilities.CreateInstance(IServiceProvider provider、Type instanceType、Object [] parameters)at Microsoft.Extensions.Internal.ActivatorUtilities.GetServiceOrCreateInstance(IServiceProvider provider、タイプ))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。プロバイダー)at Microsoft.Extens ion.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バージョン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ヘルパー拡張機能method は、IHttpContextAccessorを正しい有効期間(シングルトン)で正しく登録するために追加されました。したがって、ASP.NET Core 2.1以上では、コードは

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

ソース: https://github.com/aspnet/Hosting/issues/79

61