我有一个(工作的)MVC应用程序,它在多个部分上使用会话属性:
return httpContext.Session[SPContextKey] as SharePointAcsContext;
(忽略这是共享点;此问题不是特定于 SP 的)
在我尝试启用输出缓存之前,这工作正常:
[OutputCache (Duration =600)]
public ActionResult Select() {
DoSelect();
}
缓存内容时,httpContext.Session 变为 NULL。
有没有办法保留会话数据并使用缓存?
我自己找到了解决方案。我花了一段时间才得出结论 - 如果数据被缓存 - 根本不应该运行任何单独的代码。原因应该是缓存的主要目的:在数据兑现时不要运行任何代码。
这使我得出结论,导致问题的代码必须在缓存之前运行。所以"坏男孩"很容易找到。当缓存应用但无法访问会话时,代码中 OutputCache-Attribute 之前的另一个属性(在本例中为 AuthorizeAttribute)仍在运行:
[Route("{id}")]
[UserAuth(Roles =Directory.GroupUser)]
[JsonException]
[OutputCache(Duration = 600)]
public ActionResult Select()
{
DoSelect();
}
将 UserAuth-Attribute 放在 OutputCache-Attribute 下面解决了问题