【问题标题】:Session value not accessible in Startup.cs在 Startup.cs 中无法访问会话值
【发布时间】: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 中不起作用,我该如何解决?

【问题讨论】:

  • 您应该意识到Configureapp start 上运行,而不是按请求运行。结果,即使您完成了此操作,您也会在请求中泄露用户 ID,即使是那些不是由该用户发出的请求。从本质上讲,它只是应用启动后的第一个用户,并且所有其他请求都将使用相同的用户 ID,这几乎可以肯定不是你想要的。
  • @ChrisPratt 谢谢,我刚刚在调试时发现了这一点,我认为这是针对每个请求的。是否有正确的方法来检查每个请求的会话值?
  • 在动作/过滤器/等内部。 - 每个请求实际调用的东西。你不能在Startup 中做这样的事情,因为整个事情只运行一次。
  • @ChrisPratt 你是什么意思?当然,Configure 会在应用启动时运行,但 lambda 中的代码会根据请求运行。

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


【解决方案1】:

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

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

还取决于您使用的缓存机制,会话将无法在应用程序重新启动后继续存在。默认机制是使用DistributedMemoryCache - 它将会话保存在内存中。如果您将应用程序托管在负载均衡器后面的多台机器上,则会话为空的原因可能还有其他原因。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    相关资源
    最近更新 更多