11

嗨,有一个内存密集型仪表板,每个用户都不同。如何根据当前登录的用户 ID 缓存响应,该用户 ID 未作为参数传递,但需要从当前登录的用户派生。我的理解是 VaryByParam 查看请求上下文

数据库中还有一个值,当更改此值时,需要重置缓存

4

2 回答 2

27

在你的Web.config

<caching>
  <outputCacheSettings>
    <outputCacheProfiles>
      <add name="Dashboard" duration="86400" varyByParam="*" varyByCustom="User" location="Server" />
    </outputCacheProfiles>
  </outputCacheSettings>
</caching>

在你的Controller/ Action

[OutputCache(CacheProfile="Dashboard")]
public class DashboardController : Controller { ...}

然后在你的Global.asax

    //string arg filled with the value of "varyByCustom" in your web.config
    public override string GetVaryByCustomString(HttpContext context, string arg)
    {
        if (arg == "User")
        {
            // depends on your authentication mechanism
            return "User=" + context.User.Identity.Name;
            //?return "User=" + context.Session.SessionID;
        }

        return base.GetVaryByCustomString(context, arg);
    }

本质上,GetVaryByCustomString将让您编写一个自定义方法来确定是否会有一个 Cache hit/miss通过返回一个字符串,该字符串将用作每个 Cache 副本的某种“哈希”。

于 2013-06-19T10:36:54.037 回答
3

修改您的代码并在您的表单中添加一个隐藏字段,其中包含 userId 哈希,当您发布时。

或者更好的方法是使用 VaryByCustom 方法,并根据用户 cookie 值而变化。

这是一个很好的参考:

http://codebetter.com/darrellnorton/2004/05/04/asp-net-varybycustom-page-output-caching/

于 2013-06-19T10:33:16.363 回答