如何在 ASP.NET Core 1.0 中的 DI 中的 Startup class 中添加 IHttpContextAccessor?
How to add IHttpContextAccessor in the Startup class in the DI in ASP.NET Core 1.0?
在 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 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?
它不再是默认服务。您必须在 Startup.cs
中配置它
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>();
更新:在ASP.NET Core 2.1 中,添加了the AddHttpContextAccessor
helper extension method 以正确注册具有正确生命周期(单例)的IHttpContextAccessor
。因此,在 ASP.NET Core 2.1 及更高版本中,代码应为
services.AddHttpContextAccessor();
services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>();
可以这样添加。
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
.Net 6可以这样添加
builder.Services.AddSingleton();
在 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 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?
它不再是默认服务。您必须在 Startup.cs
中配置它services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>();
更新:在ASP.NET Core 2.1 中,添加了the AddHttpContextAccessor
helper extension method 以正确注册具有正确生命周期(单例)的IHttpContextAccessor
。因此,在 ASP.NET Core 2.1 及更高版本中,代码应为
services.AddHttpContextAccessor();
services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>();
可以这样添加。
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
.Net 6可以这样添加
builder.Services.AddSingleton