2

我想缓存我的 MVC 操作的输出。然而:

1)如果我在OutputCacheAttribute全球范围内应用,这是有风险的,因为它会为所有用户缓存所有内容。

2)如果我OutputCacheAttribute全局应用,然后将Authorize属性应用于那些需要授权的操作,那仍然不能解决问题。无论用户是否被授权,所有输出仍会被缓存。

3)如果我OutputCacheAttribute只在选择的动作上应用(不是全局的,而是),并且AuthorizeAttribute对所有需要授权的动作都有,那么就不存在安全威胁,但会有性能成本。每个需要身份验证的页面都需要发出一个新的 Http 请求。

我想找到一个中间立场,以便将选定的页面和/或选定的请求类型(HTTP GET)缓存在客户端,但前提是用户已通过身份验证。如果用户注销并访问缓存页面/动作的 url,他一定无法看到内容。

有没有办法实现这个?

4

1 回答 1

2

VaryByCustom is what you want. 把它放在你的 Global.asax 文件中:

public override string GetVaryByCustomString(HttpContext context, string custom)
{
    // use this algorithm to determine cacheability for "IsAuthenticated"
    if ("IsAuthenticated".Equals(custom, StringComparison.OrdinalIgnoreCase))
    {
        // cache content when user is authenticated
        if (User.Identity.IsAuthenticated) return "true";

        // do not cache when user is not authenticated
        return null;
    }

    return base.GetVaryByCustomString(context, custom);
}

...然后在要缓存的操作方法上使用类似的内容:

[OutputCache(VaryByCustom = "IsAuthenticated", Duration = 1800,
    Location = OutputCacheLocation.Client)]
public virtual ActionResult Index()
{ ... }
于 2013-03-19T13:20:49.023 回答