如何在ASP.NET Core 1.0的DI中的Startup类中添加IHttpContextAccessor?

问题描述 投票:15回答:1

在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.Aretivance.CreateInstance(IServiceProvider提供程序)Microsoft.Extensions.Internal.ActivateUtilities.GetServiceOrCreateInstance(IServiceProvider提供程序中的Microsoft.Extensions.Internal.ActivatorUtilities.CreateInstance(IServiceProvider提供程序,Type instanceType,Object []参数)中的Microsoft.Extensions.Internal.ConstructorMatcher.CreateInstance(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.IpendencyInjection(ServiceProvider提供程序)中的Microsoft.Extensions.DependencyInjection.ServiceLookup.FactoryService.Invoke(ServiceProvider提供程序),位于Microsoft.Extensions.DependencyInjection.SingletonCallSite.Invoke(ServiceProvider)提供者)在Microsoft.Extens在Microsoft.Extensions.DependencyInjection上的Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider提供程序,类型serviceType)上的Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(类型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)

.No Framwork Hcch v.0.030319.42000 | Msrossoft Aspnetzore主机版1.0.0-rtm-21431 | Microsoft Windows Vista 1.7.701 p

如何在应用程序启动期间获取新版本IHttpContextAccessor?

c# asp.net-core asp.net-core-mvc asp.net-core-1.0
1个回答
61
投票

它不再是默认服务。您必须在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>();

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

© www.soinside.com 2019 - 2024. All rights reserved.