AspNet Core 2视图使用Session报错:未注册HttpContext服务
解决ASP.NET Core 2视图中使用Session的HttpContext注入错误
我刚碰到过一模一样的问题!问题出在你视图里注入HttpContext的方式不对——在ASP.NET Core里,HttpContext本身不能直接作为服务注入,咱们来一步步解决它:
方法一:直接使用视图内置的Context属性(最简单)
视图里其实已经自带了一个Context属性,它就是当前请求的HttpContext,完全不需要额外注入。把你的视图代码改成这样:
@if (Context.Session.GetString("testVal")?.Equals("True") == true) { <td><input type="checkbox"></td> } else { <td><input type="checkbox" readonly></td> }
注意我加了?.空值操作符——如果Session里没有testVal这个键,GetString会返回null,直接调用Equals会触发NullReferenceException,这个判断可以避免这个问题。
方法二:注入IHttpContextAccessor(适合需要注入的场景)
如果你确实需要通过依赖注入的方式获取HttpContext(比如在自定义视图组件里),那得先注册对应的服务:
- 在
Startup.cs的ConfigureServices方法里添加IHttpContextAccessor的注册:
public void ConfigureServices(IServiceCollection services) { services.AddDistributedMemoryCache(); services.AddMvc().AddSessionStateTempDataProvider(); // 新增这一行,注册HttpContext访问器 services.AddHttpContextAccessor(); services.AddSession(options => { // Set a short timeout for easy testing. options.IdleTimeout = TimeSpan.FromMinutes(1); options.Cookie.HttpOnly = true; }); }
- 然后在视图里注入
IHttpContextAccessor而不是HttpContext:
@using Microsoft.AspNetCore.Http @inject IHttpContextAccessor HttpContextAccessor @if (HttpContextAccessor.HttpContext?.Session.GetString("testVal")?.Equals("True") == true) { <td><input type="checkbox"></td> } else { <td><input type="checkbox" readonly></td> }
为什么原来的方式会报错?
在ASP.NET Core中,HttpContext是和每个请求绑定的上下文对象,它不是一个可以直接注册到依赖注入容器的服务。而IHttpContextAccessor是框架提供的专门用来访问当前请求HttpContext的服务,它被注册为作用域服务,可以安全地在请求生命周期内获取到对应的上下文。
你在控制器里能直接用HttpContext是因为控制器基类已经通过IHttpContextAccessor帮你封装好了这个属性,所以不用手动注入,但视图里没有这个默认封装,所以不能直接注入HttpContext。
你的Startup配置其实是正确的,Session本身的配置没有问题,问题就出在视图的注入方式上~
内容的提问来源于stack exchange,提问作者David Alejandro García García
相关产品推荐
相关产品推荐

