我们现在考虑的问题是:之前的ActionFilter的OnActionExecuted是否还被执行呢? 为了弄清楚这个问题,我们来创建一个测试程序。 然后以前一个ActionFilter作为起点将创建的ActionExecutedContext对象作为输入参数调用它们的OnActionExecuted方法。 如果第一个ActionFilter在执行OnActionExecuting或者OnActionExecuted方法的过程中出现异常,那么这个异常会被直接抛出。 的OnActionExecuted方法。 的OnActionExecuted方法,最终不会有异常抛出(步骤3)。
Filter要继承于ActionFilterAttribute抽象类,并可以覆写void OnActionExecuting(ActionExecutingContext)和
void OnActionExecuted ResultExecutingContext)和
void OnResultExecuted(ResultExecutedContext)
OnActionExecuting是Action执行前的操作,OnActionExecuted ActionExecutedContext filterContext)
{
filterContext.HttpContext.Session["temp"] += "TestFilter OnActionExecuted ] += "View Execute
"; %>
最后在其它页面得到Session["temp"]的输出结果:
TestFilter OnActionExecuting
TestFilter OnActionExecuted TestFilter]
public class EiceController : Controller
{
}
2.重写Controller内的
OnActionExecuting/OnActionExecuted
图二 1.定义:以为例,可以通过继承ActionFilterAttribute并override它的OnActionExecuting和OnActionExecuted方法实现。 base.OnActionExecuting(context); //do..... } public override void OnActionExecuted (ActionExecutedContext context) { base.OnActionExecuted(context); //do OnActionExecuting Controller OnActionExecuting Action OnActionExecuting Action OnActionExecuted Controller OnActionExecuted 全局 OnActionExecuted 也是嵌套的,和中间件的处理方式类似。
下图所示的是ActionFilterAttribute的实现:
所以我们在实现了ActionFilterAttribute,然后就可以直接重写一下父类的方法如下:
publicvirtualvoid OnActionExecuted filterContext.HttpContext.Response.Write(@"
After Action execute"+"\t "+ Message);
base.OnActionExecuted 总的执行顺序是:
Action执行前:OnActionExecuting方法先执行→Action执行→OnActionExecuted方法执行→OnResultExecuting方法执行→返回的ActionRsult 最后的执行顺序是:Controller上的OnActionExecuting→Action上的OnActionExecuting→Action执行→Action上的OnActionExecuted→Controller 上的OnActionExecuted
到此Action就执行完毕了,我们看到是一个入栈出栈的顺序。
IAuthorizationFilter(OnAuthorization)----->IActionFilter(OnActionExecuting)---->控制器Action---->IActionFilter(OnActionExecuted 后执派生类的 执行应用于Action的Filter的OnActionExecuting顺序: 先执行基类的,后执派生类的 Action 方法 应用于Action的Filter的OnActionExecuted 的执行顺序 先执行派生类的,后执行基类的 应用于当前Controller的Filter中的OnActionExecuted方法 先执行派生类的,后执行基类的
OnActionExecuted 在操作方法返回之后执行。 namespace WebAPI_Filter.Filter { public class MyActionFilter : IActionFilter { public void OnActionExecuted public class MyAttributeFilter: ActionFilterAttribute { public override void OnActionExecuted } public class MyOPAttributeFilter : ActionFilterAttribute { public override void OnActionExecuted hostEnvironment) { hostEnvironment = _hostEnvironment; } public override void OnActionExecuted
private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); public override void OnActionExecuted (ActionExecutedContext context) { base.OnActionExecuted(context); DeleteSubscriptionFiles ILogger<DeleteSubscriptionCache> logger) { Logger = logger; } public override void OnActionExecuted (ActionExecutedContext context) { base.OnActionExecuted(context); DeleteSubscriptionFiles
ActionFilterAttribute类有以下的方法可以重写: OnActionExecuting – 在controller action执行之前调用 OnActionExecuted – 在controller 页面经常需要一个当前页面执行时间的功能,这是一个非功能性需求,ASP.NET MVC上就可以使用自定义的ActionFilter来实现,从上面的介绍,就知道我们需要重写OnActionExecuting和OnActionExecuted this.timer.Start(); } } public override void OnActionExecuted (ActionExecutedContext filterContext) { base.OnActionExecuted(filterContext
actionContext.ActionArguments)); base.OnActionExecuting(actionContext); } public override void OnActionExecuted actionExecutedContext.Response.Content.ReadAsStringAsync().Result); } base.OnActionExecuted
1).继承Controller,重写OnActionExecuted 默认都会继承一个Controller类,重写OnActionExecuted,添加上异常处理即可。 代码如下 public class BaseController : Controller { public override void OnActionExecuted(ActionExecutedContext Content = $"BaseController错误 : { exception.Message }" }; } base.OnActionExecuted 我们新建一个 ExceptionActionFilterAttribute, 重写 OnActionExecuted及OnResultExecuted,添加上异常处理,完整代码如下: public class ExceptionActionFilterAttribute:ActionFilterAttribute { public override void OnActionExecuted(ActionExecutedContext
///
/// <param name="filterContext"></param>
public override void OnActionExecuted OnActionExecuted
");
base.OnActionExecuted(filterContext);
}
用法1:将过滤器加到方法上
[
对应的在 ActionFilterAttribute 里面可以重写的,还有 OnActionExecuted 方法,不同之处在于 OnActionExecuting 将会在调用之前被调用,而 OnActionExecuted
IActionFilter 接口声明两个方法:OnActionExecuting 和 OnActionExecuted。 OnActionExecuting 在操作方法之前运行。 OnActionExecuted 在操作方法之后运行,可以执行其他处理,如向操作方法提供额外数据、检查返回值或取消执行操作方法。 结果筛选器。 同样,该框架将在操作方法完成后调用 OnActionExecuted 方法。 调用 OnResultExecuting 方法后,要立即调用您的操作返回的 ActionResult 实例。 public string ActionName { get; set; } private string Area; public override void OnActionExecuted (ActionExecutedContext filterContext) { base.OnActionExecuted(filterContext);
##行为过滤器 Action 过滤器继承ActionFilterAttribute实现,并提供了在两个不同时间点执行代码的能力,分别在 行为执行前(OnActionExecuting)/行为执行后(OnActionExecuted ; //base.OnActionExecuting(filterContext); } //行为执行后,结果输出前 public override void OnActionExecuted ; //base.OnActionExecuted(filterContext); } } 添加特性 同样的,添加特性使其生效 public class HomeController : Controller filterContext.HttpContext.Response.Write("Before Result<bt />"); } //结果执行后执行 public override void OnActionExecuted
else { throw new Exception("Error"); } } public override void OnActionExecuted = null) return; base.OnActionExecuted(actionExecutedContext); } } 通过阅读代码,我们应该可以发现
由于之前的过滤器我们用过了OnActionExecuting这个方法来判断权限 现在在方法被执行后我们用OnActionExecuted来监听用户的操作和刷新用户在线列表 首先下载http://files.cnblogs.com { get; set; } private string Area; // 方法被执行后的更新在线用户列表 public override void OnActionExecuted
下面我将代码贴出来,照着模仿就可以了 IActionFilter public class MyAction :Attribute,IActionFilter { public void OnActionExecuted var actionName = context.RouteData.Values["action"]; Console.WriteLine($"行为过滤器OnActionExecuted
监控程序实现 改监控程序主要继承ActionFilterAttribute类,在命名空间:System.Web.Http.Filters中,重写OnActionExecuted(HttpActionExecutedContext EntityParamsList__"] = responseData; } #endregion } public override void OnActionExecuted
actionContext.Request.Properties[Key] = stopWatch; stopWatch.Start(); } public override void OnActionExecuted
} context.Result = new JsonResult(result); } } public void OnActionExecuted