如何在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(configuration); services.Configure(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.Aretivance.CreateInstance(IServiceProvider提供程序)中的Microsoft.Extensions.Internal.ConstructorMatcher.CreateInstance(IServiceProvider提供程序),Microsoft.Extensions.Internal.ActivatorUtilities.GetServiceOrCreateInstance(IServiceProvider提供程序,在Microsoft.AspNetCore.Hosting的Microsoft.AspNetCore.Hosting.Internal.StartupLoader.LoadMethods(IServiceProvider services,Type startupType,string environmentName)上的Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetServiceOrCreateInstance(IServiceProvider提供程序,类型类型)中键入type)。 > c__DisplayClass1_0.b__1(IServiceProvider sp)位于Microsoft.Extensions.Dependency.Inpenoke.Invoke(ServiceProvider提供程序)的Microsoft.Extensions.Dependency.DependencyInjection.SupedCallSite.Invoke(ServiceProvider提供程序)中的Microsoft.Extensions.DependencyInjection.ServiceLookup.FactoryService.Invoke(ServiceProvider提供程序)。(ServiceProvider提供程序)提供者)在Microsoft.Extens 在Microsoft.Extensions.DependencyInjection上的Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider提供程序,类型serviceType)上的Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType)中的ions.DependencyInjection。 c__DisplayClass12_0.b__0(ServiceProvider提供程序)。 Microsoft.AspNetCore.Hosting.Internal.WebHost.BuildApplication()中的Microsoft.AspNetCore.Hosting.Internal.WebHost.EnsureApplicationServices()上的Microsoft.AspNetCore.Hosting.Internal.WebHost.EnsureStartup()中的.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?

它不再是默认服务。 您必须在Startup.cs中配置它

 services.TryAddSingleton(); services.TryAddSingleton(); 

更新 :在ASP.NET Core 2.1中,添加了AddHttpContextAccessor帮助程序扩展方法 ,以正确注册具有正确生存期(单例)的IHttpContextAccessor 。 因此,在ASP.NET Core 2.1及更高版本中,代码应该是

 services.AddHttpContextAccessor(); services.TryAddSingleton(); 

资料来源: https : //github.com/aspnet/Hosting/issues/793