ASP.NET MVC3, как использовать разные OutputCacheProfile для разных ролей пользователя? - PullRequest
3 голосов
/ 22 ноября 2011

Я знаю, что могу настроить OutputCacheProfiles в файле web.config.

Мне хотелось бы узнать, как применить другой профиль кэша к другую роль пользователя на странице (контроллер) уровень?

1 Ответ

6 голосов
/ 22 ноября 2011

Вы можете украсить контроллер с помощью атрибута 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>

Примечание. Вам нужно будет обязательно указать файл кэша для каждой из ваших ролей, а также по умолчанию для случаев, когда роль не найдена.

РЕДАКТИРОВАТЬ

Автор хотел знать, как установить профиль кэша в контроллере, я опубликовал жизнеспособное решение, но мне не нравится его из-за использования HttpContext.Items - так что если кто-то может предложить альтернативуves?

Во-первых, вы должны изменить 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);
}

Пустья знаю, могу ли я оказать дополнительную помощь,

Мэтт

...