【发布时间】:2018-04-18 15:39:03
【问题描述】:
在我的应用程序中,我想获取我存储的会话变量并检查是否存在用户。我用来获取会话变量的代码如下:
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();
});
}
当我使用调试器检查变量时,它是空的,并且在上下文中没有值。
我在 Startup.cs 的 ConfigureServices() 方法中添加了以下代码以使会话正常工作:
services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromMinutes(20);
options.Cookie.HttpOnly = true;
});
如果我以这种方式在控制器中设置会话:
HttpContext.Session.SetInt32("User", user.Id);
并在我的控制器中获取会话变量,如下所示。
HttpContext.Session.GetInt32("User");
这按预期工作,我得到了我的价值。
为什么这在 Startup.cs 中不起作用,我该如何解决?
【问题讨论】:
-
您应该意识到
Configure在app start 上运行,而不是按请求运行。结果,即使您完成了此操作,您也会在请求中泄露用户 ID,即使是那些不是由该用户发出的请求。从本质上讲,它只是应用启动后的第一个用户,并且所有其他请求都将使用相同的用户 ID,这几乎可以肯定不是你想要的。 -
@ChrisPratt 谢谢,我刚刚在调试时发现了这一点,我认为这是针对每个请求的。是否有正确的方法来检查每个请求的会话值?
-
在动作/过滤器/等内部。 - 每个请求实际调用的东西。你不能在
Startup中做这样的事情,因为整个事情只运行一次。 -
@ChrisPratt 你是什么意思?当然,Configure 会在应用启动时运行,但 lambda 中的代码会根据请求运行。
标签: c# asp.net session asp.net-core asp.net-core-mvc