2016-07-04 7 views
7

ASP.NET Core 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

は 'IHttpContextAccessor'は、クラスのコンストラクタで使用されなければならないので、' Startap.cs'は私の問題を解決しない依存関係を追加します。だから私は 'Program.cs'に依存関係を追加しました –

+2

1つの質問は、それがリクエストのために' AddTransient'であるべきではないでしょうか? – Ruchan

関連する問題