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

56
在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 无法解析类型为“Microsoft.AspNetCore.Http.IHttpContextAccessor”的服务,而尝试激活“MyProject.Startup”。 在应用程序启动时如何获取新版本的IHttpContextAccessor?

6
如果您查看 .Net Core 的重大变化,您会发现 IHttpContextAccessor 不再默认注册。https://github.com/aspnet/Hosting/issues/793 - DavidG
4个回答

119

它不再是默认服务。您需要在Startup.cs中进行配置。

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>();

更新: 在 ASP.NET Core 2.1 中,添加了 AddHttpContextAccessor 辅助扩展方法以正确地注册 IHttpContextAccessor 以获得正确的生命周期(单例)。因此,在 ASP.NET Core 2.1 及以上版本中,代码应为:

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

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


4
官方公告:https://github.com/aspnet/Announcements/issues/190 - MartinHN
8
这个问题应该使用 "AddTransient",因为它将用于请求。 - Ruchan
2
@Ruchan,你有没有得到这个问题的答案?应该是单例还是瞬态? - Reft
5
@Reft我使用了Singleton。这里有更多信息: https://github.com/aspnet/Hosting/issues/793,请阅读davidfowl的答案。 - Ruchan
2
@Ruchan 将 IHttpContextAccessor 注册为单例是可行的,因为它使用 AsyncLocal<T> 来存储 HttpContext。 - Memet Olsen
显示剩余5条评论

12
您可以使用以下方法在 .Net 6 中进行添加。
builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

3
您可以这样添加。
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

正确答案。通常你会想把它添加到ConfigureServices()中。 - undefined

0

如果没有完整路径,.NET 6 会报错,对我来说是有效的:

@inject Microsoft.AspNetCore.Http.IHttpContextAccessor

2
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接