AspNet Core 2没有类型的服务' Microsoft.AspNetCore.Http.HttpContext'会话问题

时间:2018-05-10 03:35:28

标签: asp.net-mvc session asp.net-core-2.0

我正在使用AspNet Core 2构建应用程序,我遇到会话问题,你能帮忙吗?

确切错误:

没有类型的服务' Microsoft.AspNetCore.Http.HttpContext'已经注册。

我使用this作为指导,但似乎还不够。

在Startup.cs

public void ConfigureServices(IServiceCollection services)
        {
            services.AddDistributedMemoryCache();
            services.AddMvc().AddSessionStateTempDataProvider();
            services.AddSession(options =>
            {
                // Set a short timeout for easy testing.
                options.IdleTimeout = TimeSpan.FromMinutes(1);
                options.Cookie.HttpOnly = true;
            });//<<==
        }
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseBrowserLink();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }
        app.UseStaticFiles();

        app.UseSession();//<<==

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");

            routes.MapSpaFallbackRoute(
                name: "spa-fallback",
                defaults: new { controller = "Home", action = "Index" });
        });
    }

在家庭控制器中:

using Microsoft.AspNetCore.Http;

HttpContext.Session.SetString("TestName", user.UserName);
HttpContext.Session.SetString("TestVal", user.testVal.ToString());

到目前为止它似乎正在工作,我能够浏览不同的页面,我可以在控制器端使用/检查会话。

但问题是我试图在任何视图中使用会话

查看方:

@using Microsoft.AspNetCore.Http
@inject HttpContext HttpContext


@if (@HttpContext.Session.GetString("testVal").Equals("True"))
{
<td><input type="checkbox"></td>
}
else
{
<td><input type="checkbox" readonly></td>
}  

当我尝试获取或设置会话时cshtml / view side我收到错误

你可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

当我找到更好的解决方案时,临时修复是:

控制器端

HttpContext.Session.SetString("TestName", user.UserName);
HttpContext.Session.SetString("TestVal", user.testVal.ToString());
HttpContext.Session.SetString("SecurityToken", securityToken);
ViewBag.TestVal = user.testVal.ToString();

查看方

@if (ViewBag.TestVal.Equals("True"))
{
<td><input type="checkbox"></td>
}
else
{
<td><input type="checkbox" readonly></td>
} 

其中安全令牌是会话开始时创建的随机长值,这不是最好的方法...并且每次要更新,创建或删除某些内容时都必须验证此令牌,加上AntiForgeryToken可能是非常适合非产品测试或第一次接种......

如果您知道更好的方式,请分享