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)
{
}
}