会话变量立即为空.ASP.net核心

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了会话变量立即为空.ASP.net核心相关的知识,希望对你有一定的参考价值。

ASp.Net核心2.1

我在一个控制器中设置了一个会话变量:

 public ActionResult setsession()
    

       HttpContext.Session.SetString("name","Fozzy");

      return Ok();
    

当我在设置会话变量后暂停调试器时,我可以在此时看到会话中的值。然后,我尝试通过fetch立即在另一个控制器中检索会话变量,但它始终为null:

   public ActionResult getsession()
    

        var fozzy =  HttpContext.Session.GetString("name");
        // fozzy is null
      return Ok(fozzy);
    

我已将会话超时设置为20分钟(我认为)

    services.AddSession(options =>
        

            options.IdleTimeout = TimeSpan.FromMinutes(20);
        );

这是我的startup.cs:

      public void ConfigureServices(IServiceCollection services)
    
        services.AddCors(options =>
        
            options.AddPolicy("CorsPolicy", builder =>
                builder.AllowAnyOrigin()
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowCredentials());
        );

        services.Configure<CookiePolicyOptions>(options =>
        
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => false;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        );
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

        services.AddDistributedMemoryCache();
        services.AddSession(options =>
        

            options.IdleTimeout = TimeSpan.FromMinutes(20);
        );
        services.AddMvc().AddSessionStateTempDataProvider();

    

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    
        app.UseCors("CorsPolicy");
        app.UseSession();
        app.UseMvc(routes =>
        
            routes.MapRoute(
                name: "default",
                template: "controller/action=Index/id?");

            routes.MapSpaFallbackRoute(name: "spa-fallback",
                defaults: new  controller = "values", action = "Get" );
        );
        //if (env.IsDevelopment())
        //
        //    app.UseDeveloperExceptionPage();
        //
        //else
        //
        //    app.UseExceptionHandler("/Home/Error");
        //    app.UseHsts();
        //

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();

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

我的问题不是设置会话变量。我经历了那场噩梦。如果设置变量是个问题,.Net Core会抛出异常。我已经完成了所有这些。

如何让我的会话保留在ASP.net Core 2.1中的值?谢谢

答案

根据the documentation on session state,您需要按照以下三个步骤在ASP.NET Core中启用会话:

要启用会话中间件,Startup必须包含:

因此,除了设置常规会话服务以便您可以访问它的services.AddSession()之外,您还需要执行services.AddDistributedMemoryCache()以便存储数据。最后,在Configure中,您需要使用app.UseSession()设置会话中间件,以确保在处理请求时读取会话数据,以便您可以访问以前存储的数据。

另一答案

我意识到已经有了这个问题的答案,但是我遇到了同样的问题,其中保存到会话的值没有保留,但设法解决了我的具体问题。

我在两个域上有两台机器,在一个域上会话值按预期保存,另一个域保存,并且可以在save方法中检索它,但是从另一个控制器/方法返回null。想象它可能是安全设置。

事实证明我的问题是由ConfigureServices中的CookiePolicyOptions引起的:我将CheckConsentNeeded设置为true。将其设置为false后,它按预期工作。

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

以上是关于会话变量立即为空.ASP.net核心的主要内容,如果未能解决你的问题,请参考以下文章

如果当前的 ASP.NET 会话为空,我该怎么办?

Asp.net 核心中的会话和应用程序变量,以防我们使用 JWT 令牌(因此没有基于 cookie 的会话)

asp.net核心中的TempData为空

Asp.net 核心导航属性始终为空

在 asp.net 核心中使用输入标签助手 - “值”为空

ASP.Net核心模型日期属性在编辑模式下为空