会话变量立即为null。ASP.netCore

时间:2019-04-13 15:06:21

标签: c# asp.net-core

ASp.Net核心2.1

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

 public ActionResult setsession()
    {

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

      return Ok();
    }

当我在之后暂停调试器时,我可以在会话中看到该值  设置会话变量。然后,我尝试通过获取立即在另一个控制器中检索会话变量,但该变量始终为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中的值?谢谢

3 个答案:

答案 0 :(得分:1)

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

  

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

     

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

答案 1 :(得分:0)

我意识到已经有了一个答案,但是我遇到了同样的问题,即保存到会话中的值并没有持久化,而是设法解决了我的特定问题。

我在两个域上有两台计算机,在一个域上,会话值按预期方式被保存,在另一个域上,会话值被保存,并且可以在save方法中对其进行检索,但是从另一控制器/方法中,它返回null。认为这可能是安全设置。

原来我的问题是由ConfigureServices中的CookiePolicyOptions引起的:我将CheckConsentNeeded设置为true。将其设置为false后,它可以按预期工作。

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

答案 2 :(得分:0)

设置“ options.Cookie.IsEsssential = true;”后,我遇到了同样的问题。在AddSession上。一切正常。

post