gpt4 book ai didi

asp.net-mvc - 在 Controller 级别应用时如何禁用操作属性?

转载 作者:行者123 更新时间:2023-12-02 14:26:14 25 4
gpt4 key购买 nike

我有以下 Controller :

[NoCache]
public class AccountController : Controller
{
[Authorize(Roles = "admin,useradmin")]
public ActionResult GetUserEntitlementReport(int? userId = null)
{
var byteArray = GenerateUserEntitlementReportWorkbook(allResults);

return File(byteArray,
System.Net.Mime.MediaTypeNames.Application.Octet,
"UserEntitlementReport.xls");
}
}

public class NoCache : ActionFilterAttribute
{
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
var response = filterContext.HttpContext.Response;
response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
response.Cache.SetValidUntilExpires(false);
response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
response.Cache.SetCacheability(HttpCacheability.NoCache);
response.Cache.SetNoStore();
base.OnResultExecuting(filterContext);
}
}

如您所见, Controller 使用 [NoCache] 属性进行修饰。

有什么方法可以阻止此属性应用于 GetUserEntitlementReport 操作吗?

我知道我可以在 Controller 级别删除该属性,但这不是我最喜欢的解决方案,因为 Controller 包含许多其他操作,并且我不想将该属性独立地应用于每个操作。

最佳答案

您可以创建一个新属性,该属性可用于单个操作以选择退出在 Controller 级别指定的 NoCache。

[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Method,
AllowMultiple = false,
Inherited = true)]
public sealed class AllowCache : Attribute { }

使用[AllowCache]标记您想要允许缓存的任何操作

然后,在 NoCacheAttribute 的代码中,仅在 AllowCache 属性不存在时禁用缓存

public class NoCacheAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);

var actionDescriptor = filterContext.ActionDescriptor;
bool allowCaching = actionDescriptor.IsDefined(typeof(AllowCache), true) ||
actionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowCache), true);

if(!allowCaching)
{
//disable caching.
}
}
}

关于asp.net-mvc - 在 Controller 级别应用时如何禁用操作属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14835258/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com