Вы можете украсить контроллер с помощью атрибута 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);
}
Пустья знаю, могу ли я оказать дополнительную помощь,
Мэтт