【发布时间】: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。
我可以看到当我导航到一个页面时调用了OnActionExecuting 和Initialize 方法,并且当SPUsers 会话变量为null 时调用了InitialiseUsers 方法。
问题是,会话变量是总是null。
这是为什么呢?
为什么InitailiseUsers 中的值没有更新?还是在到达其他两种方法之前清除了该值?
感谢任何指导。
【问题讨论】:
-
您可能会在这篇文章中找到回答问题的提示:stackoverflow.com/questions/1382791/…
-
使用会话意味着一个有状态的网络服务器。这不成比例。一般来说,状态是我保存在数据库中的东西。
-
@spender 我正在从 SharePoint 列表中检索数据,但 CSOM 真的很慢,所以我想在会话中缓存该数据
-
看起来每个人都会在会话变量中得到相同的用户列表。也许单例(应用程序上下文或静态属性)会更好地实现可伸缩性。除此之外,确定 spClient.GetAllUsers() 没有返回 null 吗?
-
@Obie 谢谢Obie - 静态属性正是我需要的,因为你是对的 - 用户列表将始终相同(所有用户!)如果你愿意,我可以发布答案'会接受
标签: c# asp.net-mvc session request