gpt4 book ai didi

asp.net-mvc - 不同 Action 的相同 Action 过滤器

转载 作者:行者123 更新时间:2023-12-03 23:28:48 25 4
gpt4 key购买 nike

我正在实现一个从 AuthorizeAttribute 继承的自定义授权过滤器。经过我的研究,我发现 Action 过滤器被缓存了,所以它们只被实例化一次。

这是我的问题。如果我实现并使用如下所示的自定义操作过滤器,它应该无法正常工作,因为它会被实例化一次并且永远不会再次调用构造函数。但是当我测试时,效果很好所以我在想有什么我不知道的。

谁能清楚地解释这个( Action 过滤器生命周期?)?

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
private readonly string value = string.Empty;

public CustomAuthorizeAttribute(string value)
{
this.value = value;
}

protected override bool AuthorizeCore(HttpContextBase httpContext)
{
// Do something with this.value
}
}

public class HomeController : Controller
{
[CustomAuthorize("ACCESS_INDEX")]
public ActionResult Index()
{
}

[CustomAuthorize("ACCESS_LOGIN")]
public ActionResult Login()
{
}
}

最佳答案

不要这样做。

以我自己的经验,在 Action 上使用私有(private)变量是不可靠的,即使它有时看起来有效,你最终可能会得到一些非决定性的东西。

看,您的代码可能适用于 1 个请求,但在同时处理多个请求时根本不起作用。

该用户的问题是声称与您完全相反的体验:How to use ActionFilterAttribute to log running times?

我唯一的解释是,如果 Action Invoker 实例化了 Action 过滤器,并且要么:它不会将其保留很长时间,要么它会创建一个实例池(或两者兼而有之)。

我有一个原型(prototype),它将上下文作为私有(private)操作属性,它偶尔会(不是每次)抛出与并发使用相关的 EF 错误 (这对 EF 来说是个问题。)

这告诉我,我的 Action 被同时使用了不止一次。

我建议将他们的操作集中在使用过滤器上下文。过滤器上下文包含当前正在发生的所有事情,对于这个请求。在 MVC 中,您可以使用 filterContext.HttpContext.Items 存储用于此特定请求的项目。 (见 Accessing Action Filter's data in Controller Action)

最后,还可以证明不同版本的 MVC 框架对 Action 过滤器的生命周期进行了不同的优化。

关于该主题的几个有用链接:

一般 MVC 生命周期的一些细节
http://blog.christopheargento.net/2012/06/11/detailed-life-cycle-of-an-asp-net-mvc-request/

在谈论如何创建动态 Action 过滤器(以编程方式插入和动态更改)时,Dino Esposito 研究了正在发生的事情的一些不足之处
https://msdn.microsoft.com/en-us/magazine/gg309182.aspx

自定义操作过滤器和多个存在时的过滤器顺序
http://www.asp.net/mvc/overview/older-versions/hands-on-labs/aspnet-mvc-4-custom-action-filters

关于asp.net-mvc - 不同 Action 的相同 Action 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21010171/

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