启用输出缓存时会话丢失



我有一个(工作的)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 下面解决了问题

最新更新