【问题标题】:Session variable is cleared before calling controller在调用控制器之前清除会话变量
【发布时间】:2018-02-28 00:15:53
【问题描述】:

当用户使用应用程序时,我需要始终更新 Session 变量。

我尝试了以下方法:

public class MyController : Controller
{
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var a = filterContext.HttpContext.Session["SPUsers"];
        if (filterContext.HttpContext.Session["SPUsers"] != null)
        {
            new Task(InitialiseUsers).Start();
        }
        base.OnActionExecuting(filterContext);
    }

    protected override void Initialize(RequestContext requestContext)
    {
        var a = requestContext.HttpContext.Session["SPUsers"];
        if (requestContext.HttpContext.Session["SPUsers"] == null)
        {
            new Task(InitialiseUsers).Start();
        }
        base.Initialize(requestContext);
    }

    private void InitialiseUsers()
    {
        var spClient = new SPClient(ConfigurationManager.AppSettings["ADVBaseUrl"]);
        Session["SPUsers"] = spClient.GetAllUsers();
    }
}

我的所有其他控制器都继承自 MyController

我可以看到当我导航到一个页面时调用了OnActionExecutingInitialize 方法,并且当SPUsers 会话变量为null 时调用了InitialiseUsers 方法。

问题是,会话变量是总是null

这是为什么呢?

为什么InitailiseUsers 中的值没有更新?还是在到达其他两种方法之前清除了该值?

感谢任何指导。

【问题讨论】:

  • 您可能会在这篇文章中找到回答问题的提示:stackoverflow.com/questions/1382791/…
  • 使用会话意味着一个有状态的网络服务器。这不成比例。一般来说,状态是我保存在数据库中的东西。
  • @spender 我正在从 SharePoint 列表中检索数据,但 CSOM 真的很慢,所以我想在会话中缓存该数据
  • 看起来每个人都会在会话变量中得到相同的用户列表。也许单例(应用程序上下文或静态属性)会更好地实现可伸缩性。除此之外,确定 spClient.GetAllUsers() 没有返回 null 吗?
  • @Obie 谢谢Obie - 静态属性正是我需要的,因为你是对的 - 用户列表将始终相同(所有用户!)如果你愿意,我可以发布答案'会接受

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


【解决方案1】:

看起来每个人最终都会在会话变量中得到相同的用户列表。也许单例(应用程序上下文或静态属性)会更好地实现可伸缩性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    相关资源
    最近更新 更多