剃刀会话数据-HttpContextAccessor为空

时间:2019-11-18 09:16:44

标签: c# asp.net asp.net-mvc-5

我是MVC5的新手,创建了一个测试网站来查看MVC5和Razor

用户登录后,我有一个非常简单的网站,我需要通过_Layout从“登录”更改菜单以添加“注销”“帐户”。

注意:该站点具有自己的身份验证,稍后我将介绍一次登录。

我真的很难在MVC5中管理会话数据,不确定哪种方法最好。我已经尝试了TEMP DATA,但是尽管达到了顶峰,但我发现在用户在几个页面之间进行重定向之后,数据丢失了。因此,我们看了好旧的cookie,但是由于GDPR,我可以说开箱即用的cookie的默认支持要少得多。

无论如何,我相信我在做所有正确的事情

public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                                   options.CheckConsentNeeded = context => false;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });   
            services.AddDistributedMemoryCache();  
            services.AddSession(options =>
            {
                // Set session timeout value
                options.IdleTimeout = TimeSpan.FromSeconds(30);
                options.Cookie.HttpOnly = true;
            });
        }


services.AddMvc();
services.AddCaching(); 
services.AddSession();
services.AddHttpContextAccessor();

依赖项将其注入,但是当我尝试调用SetString时在Post中将其称为“私有只读IHttpContextAccessor _httpContextAccessor;”。为空

奇怪的是_Layout没有抛出相同的null异常

   @using Microsoft.AspNetCore.Http
   @inject IHttpContextAccessor HttpContextAccessor

   @{
        string UserId = HttpContextAccessor.HttpContext.Session.GetString("UserId");
   }

使用ASP.Net(一种简单的处理Session的方法)工作后,开始质疑我是否错过了某些东西,因为MVC5中似乎有很多工作要做。所以我应该在MVC5中使用其他方法

2 个答案:

答案 0 :(得分:0)

设置

options.CheckConsentNeeded = context => false;

这是正确的,即

options.CheckConsentNeeded = context => true;

,您的会话将不再为空。

答案 1 :(得分:0)

只想添加此代码给其他人,可能不是最干净的代码 有了帮助表格,Sanjay现在可以启动并运行一个原始站点

启动类,示例代码

公共类启动     {

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {

        services.Configure<CookiePolicyOptions>(options =>
        {
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        services.AddHttpContextAccessor();
        services.AddRazorPages();

        services.AddRazorPages();
        services.AddDistributedMemoryCache();
        services.AddSession(options =>
        {
            options.IdleTimeout = TimeSpan.FromSeconds(30);
        });
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseRouting();
        app.UseSession();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });
    }
}

}

.csHtml的代码

@using Microsoft.AspNetCore.Http;
@inject IHttpContextAccessor HttpContextAccessor

@{
    if (Context.Session.GetString("UserRole") != null)
    {

.cs的代码

    private readonly IHttpContextAccessor HttpContextAccessor;
    public LoginModel(ISiteUserService siteUserService, 
        IHttpContextAccessor httpContextAccessor)
    {
        this.HttpContextAccessor = httpContextAccessor;        
    }
    public IActionResult OnGet()
    {

        if(HttpContextAccessor.HttpContext.Session.GetString("UserRole")!= null)
        {