ASP.NET MVC3,如何将不同的OutputCacheProfile用于不同的用户角色?

时间:2011-11-21 21:02:31

标签: asp.net-mvc-3 web-config browser-cache outputcache user-roles

我知道我可以在web.config文件中设置OutputCacheProfiles。

我想知道如何在页面(控制器)级别将不同的缓存配置文件应用于不同的用户角色

1 个答案:

答案 0 :(得分:6)

您可以使用OutputCache属性修饰控制器,该属性允许将参数作为参数传递。例如;

[OutputCache(Duration = 3600, VaryByParam = "None")]

没有理由不扩展属性以获取另一个参数“RoleName”并执行“Roles.IsUserInRole(RoleName)”并根据每个角色加载不同的设置。

修改

在作者发表评论后,我已经审核了我的解决方案。

首先,您可以在Web.config中定义缓存配置文件;

<caching>
  <outputCacheSettings>
    <outputCacheProfiles>
      <clear />

      <add name="Default" duration="60" />
      <add name="Admin" duration="10" />
    </outputCacheProfiles>
  </outputCacheSettings>
</caching>

我已将OutputCacheAttribute扩展为用户授权的帐户,如果用户进行身份验证,则会加载该CacheProfile;

public class AuthorisedOutputCache : OutputCacheAttribute
{
  public string RoleName { get; set; }

  public override void OnActionExecuting(ActionExecutingContext filterContext)
  {
    // Default Profile.
    CacheProfile = "Default";

    if (HttpContext.Current.Request.IsAuthenticated)
    {
      if (Roles.IsUserInRole(RoleName))
      {
        CacheProfile = RoleName;
      }
    }

    base.OnActionExecuting(filterContext);
  }
}

这是完整性的Index.cshtml文件;

@model DateTime

@{
  ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>
  The time is @Model.TimeOfDay.ToString()
</p>

注意:您必须确保为每个角色定义一个cacheprofile,以及未找到角色时的默认值。

修改

作者想知道如何在控制器中设置缓存配置文件,我已经发布了一个可行的解决方案,但我不喜欢它,因为使用了HttpContext.Items - 所以如果有人可以建议替代方案吗?

首先,您必须将OnActionExecuting更改为OnActionExecuted;

public class AuthorisedOutputCache : OutputCacheAttribute
{
  public string RoleName { get; set; }

  public override void OnActionExecuted(ActionExecutedContext filterContext)
  {
    // Do you wish to force the profile?
    if (HttpContext.Current.Items["Cache.Force"] != null)
    {
      // Force the profile and remove the flag.
      CacheProfile = HttpContext.Current.Items["Cache.Force"].ToString();
      HttpContext.Current.Items.Remove("Cache.Force");
    }
    else
    {
      // If the profile has not been set - use the role based authorisation - 
      // otherwise, carry on as normal.
      if (string.IsNullOrEmpty(CacheProfile))
      {
        CacheProfile = "Default";

        if (HttpContext.Current.Request.IsAuthenticated)
        {
          if (Roles.IsUserInRole(RoleName))
          {
            CacheProfile = "Admin";
          }
        }
      }
    }

    base.OnActionExecuted(filterContext);
  }
} 

以下行允许您在控制器中设置配置文件;

public ActionResult Index()
{
  // Forces the cache profile to one of the name of "Mandatory".
  HttpContext.Items["Cache.Force"] = "Mandatory";

  return View(IndexViewName, DateTime.Now);
}

如果我能得到进一步的帮助,请告诉我,

马特