Startup.cs中无法访问会话值

时间:2017-11-06 12:56:50

标签: c# asp.net session asp.net-core asp.net-core-mvc

在我的应用程序中,我想获取我存储的会话变量,并检查是否存在用户。我用来获取会话变量的代码如下:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    // Some other default code.
    app.UseSession();

    app.Use((context, next) =>
    {
        int? userId = context.Session.GetInt32("User");
        // Use the variable.

        return next();
    });
}

当我用调试器检查变量时,它是空的,在上下文中没有值。

我将以下代码添加到方法ConfigureServices()中的Startup.cs以使会话工作:

services.AddSession(options =>
{
    options.IdleTimeout = TimeSpan.FromMinutes(20);
    options.Cookie.HttpOnly = true;
});

如果我以这种方式在我的控制器中设置会话:

HttpContext.Session.SetInt32("User", user.Id);

在我的控制器中获取会话变量,如下所示。

HttpContext.Session.GetInt32("User");

这符合预期,我得到了我的价值。

为什么这在Startup.cs中不起作用,我该如何解决?

1 个答案:

答案 0 :(得分:3)

我重建了你的场景,并确认它按预期工作。我能够在中间件和控制器中访问会话。

您确定要在某处设置会话变量吗?即使在中间件中访问它,您也需要先设置变量。如果在控制器中设置它,中间件仍将首先执行,并且第一次请求时会话将为空。

同样依赖于您使用的缓存机制,会话将无法在应用程序重新启动后继续存在。默认机制是使用DistributedMemoryCache - 它将会话保留在内存中。如果您在负载均衡器后面的多台计算机上托管您的应用程序,则可能是会话为空的另一个原因。

但到目前为止,您的代码看起来绝对有效并可在我的机器上运行。