将ASP.NET MVC属性和动作过滤器注释组合在一起

时间:2012-07-30 11:26:05

标签: asp.net-mvc

我的一些控制器操作需要用户进行身份验证。这些操作使用自定义[Authorize]属性进行标记。在幕后,一个自定义成员资格提供程序做了一些魔术,其中将一些临时数据设置到公共线程中。

在每个需要身份验证的操作结束时,需要调用OnActionExecuted()过滤器来清理线程。这是通过另一个名为[CleanupContext]的自定义属性完成的。

所以我的行为如下:

[Authorize]
[CleanupContext]
public ViewResult Action()
{
   ...
}

因为这两个人总是在一起使用,因为我很懒,而且因为我担心有一天,一个开发者可能会忘记放一个或者另一个我们最终会产生一些奇怪的行为:有没有办法将它们结合起来进入一个属性?

[AuthorizeAndCleanup]
public ViewResult Action()
{
   // Aaah, if only it could look like this :D
}

非常感谢!

3 个答案:

答案 0 :(得分:3)

您可以从AuthorizeAttribute派生,以便执行自定义授权内容并实施IActionFilter,以便能够访问OnActionExecutingOnActionExecuted事件(自定义清理代码):

public class AuthorizeAndCleanupAttribute : AuthorizeAttribute, IActionFilter
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        // TODO: your custom authorization logic
        return base.AuthorizeCore(httpContext);
    }

    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
        // TODO: your custom cleanup code
    }

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
    }
}

显然你应该知道,如果授权失败(OnActionExecuting方法返回false),OnActionExecutedAuthorizeCore事件都不会被执行,所以请确保你做的是如果您要返回false,请使用此方法进行清理。

答案 1 :(得分:0)

快点。我可以想到的脏和(可能)慢的解决方案是跳过清理属性并检查OnActionExecuted()中是否存在自定义Authorize属性,并在找到它时执行任何清理代码(因为你声明它们总是在一起)。

答案 2 :(得分:0)

您应该实施自己的过滤器提供程序(http://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.html),它会自动将Cleanup属性添加到任何操作以Authorize标记。