Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 将ASP.NET MVC属性和操作过滤器注释组合在一起_Asp.net Mvc - Fatal编程技术网

Asp.net mvc 将ASP.NET MVC属性和操作过滤器注释组合在一起

Asp.net mvc 将ASP.NET MVC属性和操作过滤器注释组合在一起,asp.net-mvc,Asp.net Mvc,我的一些控制器操作需要对用户进行身份验证。这些操作用自定义的[Authorize]属性标记。在幕后,一个自定义成员资格提供者做了一些魔术,其中包括将一些临时数据设置到公共线程中 在每个需要身份验证的操作结束时,需要调用OnActionExecuted()过滤器来清理线程。这是通过另一个名为[CleanupContext]的自定义属性完成的 所以我的行动是这样的: [Authorize] [CleanupContext] public ViewResult Action() { ... }

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

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

所以我的行动是这样的:

[Authorize]
[CleanupContext]
public ViewResult Action()
{
   ...
}
因为这两个属性总是一起使用,因为我很懒,因为我担心有一天一个开发人员可能会忘记放一个或另一个,我们最终会出现一些奇怪的行为:有没有办法将它们组合成一个属性?

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

快一点。我能想到的肮脏且(可能)缓慢的解决方案是跳过cleanup属性,并检查OnActionExecuted()中是否存在自定义授权属性,如果找到它,则执行任何清理代码(因为您声明它们总是同时存在)。

请快速浏览。我能想到的肮脏且(可能)缓慢的解决方案是跳过cleanup属性,检查OnActionExecuted()中是否存在自定义Authorize属性,并在找到它时执行任何清理代码(因为您声明它们总是同时存在).

您可以从中派生以执行自定义授权工作,并实现以访问和事件(执行自定义清理代码):

显然,您应该知道,如果授权失败,
OnActionExecuting
OnActionExecuted
事件都不会执行(也就是说,
AuthorizeCore
方法返回false)因此,如果要返回false,请确保使用此方法进行清理。

您可以从中派生以执行自定义授权,并实现以访问和事件(执行自定义清理代码):


显然,您应该知道,如果授权失败,
OnActionExecuting
OnActionExecuted
事件都不会执行(也就是说,
AuthorizeCore
方法返回false)因此,如果要返回false,请确保使用此方法进行清理。

您应该实现自己的筛选器提供程序(http://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.html)这将自动将
清理
属性添加到
授权标记的任何操作中

您应该实现自己的筛选器提供程序(http://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.html)它将自动将
Cleanup
属性添加到由
Authorize

标记的任何操作中。据我所知,只有当
[CleanupContext]
属性存在时,才会执行OnActionExecuted()函数,因此我无法避免对其进行设置。每次操作后都会调用OnActionExecuted()。我使用它来运行基于自定义属性的代码,并根据操作调用期间发生的事情来处理信息。您可以访问操作方法有权访问的完整上下文,包括将要发送到客户端的结果。据我所知,只有当
[CleanupContext]
属性存在时,才会执行OnActionExecuted()函数,因此我无法避免设置它。OnActionExecuted()在每个操作之后调用。我使用它来运行基于自定义属性的代码,并根据操作调用期间发生的事情来处理信息。您可以访问操作方法有权访问的完整上下文,包括将要发送给客户端的结果。这是一个有趣的问题。这显然会起作用,但会阻止我将来独立使用这两个属性。除此之外,还有有趣的编辑技巧;)为什么这会阻止您使用这两个属性?如果要独立重用这两个属性,您仍然可以保留它们。对于需要放置这两个属性的情况,只需使用自定义属性即可完成这两个属性的工作。这是一个有趣的观点。这显然会起作用,但会阻止我将来独立使用这两个属性。除此之外,还有有趣的编辑技巧;)为什么这会阻止您使用这两个属性?如果要独立重用这两个属性,您仍然可以保留它们。对于需要放置这两个属性的情况,只需使用自定义属性即可完成这两个属性的工作。
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)
    {
    }
}