在我的应用程序中,我想获取我存储的会话变量,并检查是否存在用户。我用来获取会话变量的代码如下:
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中不起作用,我该如何解决?
答案 0 :(得分:3)
我重建了你的场景,并确认它按预期工作。我能够在中间件和控制器中访问会话。
您确定要在某处设置会话变量吗?即使在中间件中访问它,您也需要先设置变量。如果在控制器中设置它,中间件仍将首先执行,并且第一次请求时会话将为空。
同样依赖于您使用的缓存机制,会话将无法在应用程序重新启动后继续存在。默认机制是使用DistributedMemoryCache
- 它将会话保留在内存中。如果您在负载均衡器后面的多台计算机上托管您的应用程序,则可能是会话为空的另一个原因。
但到目前为止,您的代码看起来绝对有效并可在我的机器上运行。