1: public interface IActionFilter 2: { 3: void OnActionExecuting(ActionExecutingContext ActionFilter可以在OnActionExecuting方法中对ActionExecutingContext对象的Result属性进行赋值来直接响应当前的请求。 BarAttribute重写了OnActionExecuting方法,在调用基类同名方法之后为ActionExecutingContext的Result设置了一个EmptyResult对象。 如果第一个ActionFilter在执行OnActionExecuting或者OnActionExecuted方法的过程中出现异常,那么这个异常会被直接抛出。 在执行OnActionExecuting方法的时候抛出一个异常。
return RedirectLogin(); return View(); } } b) 后来学习了很多人的代码后,发现在Controller里有一个OnActionExecuting 派生类如下: public class AuthenticationControllor : Controller { protected override void OnActionExecuting Login", new RouteValueDictionary { { "from", Request.Url.ToString() } }); base.OnActionExecuting ActionFilterAttribute里也有OnActionExecuting方法,跟Controller一样, 同是抽象实现了IActionFilter接口。 : // 登录认证特性 public class AuthenticationAttribute : ActionFilterAttribute { public override void OnActionExecuting
方法,这个 OnActionExecuting 方法将会在对应的 API 所在的接口 C# 方法被调用之前被调用。 将会在被调用之后被调用,细节请参阅 官方文档 本文是需要在方法被调用之前进行执行的,因此只重写 OnActionExecuting 方法,代码如下 public override void OnActionExecuting(ActionExecutingContext context) { if (CheckIsLocal(context.HttpContext )) { base.OnActionExecuting(context); } else 而如果给定了 context 的 Result 属性,同时不调用 base.OnActionExecuting 方法,那么将不会继续执行 通过这个特性,咱可以判断,如果是本地的 IP 访问,那么继续执行
Filter要继承于ActionFilterAttribute抽象类,并可以覆写void OnActionExecuting(ActionExecutingContext)和 void OnActionExecuted ) 以及void OnResultExecuting(ResultExecutingContext)和 void OnResultExecuted(ResultExecutedContext) OnActionExecuting 名字叫做TestFilter public class TestFilter : ActionFilterAttribute { public override void OnActionExecuting 在它的View中写入: <%Session["temp"] += "View Execute<br/>"; %> 最后在其它页面得到Session["temp"]的输出结果: TestFilter OnActionExecuting 上,如: [TestFilter] public class EiceController : Controller { } 2.重写Controller内的 OnActionExecuting
以下内容抄自博客园: .net Mvc 过滤器执行顺序: IAuthorizationFilter(OnAuthorization)----->IActionFilter(OnActionExecuting IResultFilter(OnResultExecuting)---->视图---->IResultFilter(OnResultExecuted) Filter的具体生存周期 : 来自controller虚方法 的OnActionExecuting 应用于当前Controller的Filter中的OnActionExecuting: 先执行基类的,后执派生类的 执行应用于Action的Filter的OnActionExecuting顺序
auth == authorization; } } BasicAuthenticationAttribute的代码也很简单,Attribute注入了一个Service并且重写了OnActionExecuting 再来解释下这个问题是如何造成的:一开始BasicAuthenticationAttribute是framework版本的ASP.NET MVC迁移过来的,按照惯例重写了OnActionExecuting 其中注入的service里面的方法是异步的,尽管标记了await,但是这并没有什么卵用,因为框架在调用OnActionExecuting的时候并不会在前面加上await来等待这个方法。 于是一个重写了OnActionExecuting的Filter配合一个异步的Action执行的时候并不会如预设的一样先等待OnActionExecuting执行完之后再执行action。 如果OnActionExecuting里出现异步方法,那这个异步方法很可能跟Action里的异步方法同时执行,这样在高并发的时候就出现EF的Context被多线程操作的异常问题。
public class GlobalActionFilterAttribute: ActionFilterAttribute { public override void OnActionExecuting 方法")] public void When() { GlobalActionFilterAttribute.OnActionExecuting(HttpActionContext >()).Returns(new Collection<BypassModelStateValidationAttribute>()); } [When(@"执行OnActionExecuting 方法")] public void When() { GlobalActionFilterAttribute.OnActionExecuting(HttpActionContext 方法")] public void When() { GlobalActionFilterAttribute.OnActionExecuting(HttpActionContext
ActionFilterAttribute public class ActionFilterAttributeLogin: ActionFilterAttribute { public override void OnActionExecuting filterContext.Result = new RedirectResult("/Account/Login"); } base.OnActionExecuting class NoPermissionRequiredAttribute : ActionFilterAttribute { public override void OnActionExecuting (ActionExecutingContext filterContext) { base.OnActionExecuting(filterContext
图二 1.定义:以为例,可以通过继承ActionFilterAttribute并override它的OnActionExecuting和OnActionExecuted方法实现。 Test1Filter如下: public class Test1Filter : ActionFilterAttribute { public override void OnActionExecuting (ActionExecutingContext context) { base.OnActionExecuting(context); / 默认情况下,全局的为10、Controller上的为20、Action上的为30.也就是说,Filter的执行顺序为 全局 -> Controller -> Action, 实际的执行顺序是这样的: 全局 OnActionExecuting Controller OnActionExecuting Action OnActionExecuting Action OnActionExecuted
execute"+"\t "+ Message);
base.OnActionExecuted(filterContext);
}
publicoverridevoid OnActionExecuting filterContext.HttpContext.Response.Write(@"
Before Action execute"+"\t "+ Message);
base.OnActionExecuting 总的执行顺序是:
Action执行前:OnActionExecuting方法先执行→Action执行→OnActionExecuted方法执行→OnResultExecuting方法执行→返回的ActionRsult execute"+"\t "+ Message);
base.OnActionExecuted(filterContext);
}
publicoverridevoid OnActionExecuting 最后的执行顺序是:Controller上的OnActionExecuting→Action上的OnActionExecuting→Action执行→Action上的OnActionExecuted→Controller
1.1、LoginAttribute.cs 过滤器 LoginAttribute继承ActionFilterAttribute并重写了OnActionExecuting方法,OnActionExecuting 我们打开ActionFilterAttribute发现里面有四个方法OnActionExecuted、OnActionExecuting、OnResultExecuted、OnResultExecuting Attribute { public class LoginAttribute : ActionFilterAttribute { public override void OnActionExecuting filterContext.Result = new RedirectResult("~/Login/index"); } base.OnActionExecuting
IActionFilter 接口声明两个方法:OnActionExecuting 和 OnActionExecuted。 OnActionExecuting 在操作方法之前运行。 创建自定义操作筛选器 框架将先调用操作筛选器的 OnActionExecuting 方法,然后再调用以操作筛选器特性标记的任意操作方法。 以上都是理论问题了,说到底我们就是要OnActionExecuting利用这个方法 当一个Action被执行时调用OnActionExecuting判断是否有权限操作。 由于OnActionExecuting涉及到其他用户和权限的访问我们需要添加SysUser和SysRight的BLL和DAL层了 我们还需要一个存储过程[P_Sys_GetRightOperate]用于取模块的当前用户操作权限 OnActionExecuting负责分解,交给ValiddatePermission去生成权限 如果写在Areas区域的也是兼容的,已经做了处理。
user.Name); } 2.控制器拦截处理,代码: public class MyFilter : ActionFilterAttribute { public override void OnActionExecuting (HttpActionContext actionContext) { base.OnActionExecuting(actionContext); //获取请求参数
ActionFilterAttribute类有以下的方法可以重写: OnActionExecuting – 在controller action执行之前调用 OnActionExecuted – 在controller 实现的功能是Action的执行时间,页面经常需要一个当前页面执行时间的功能,这是一个非功能性需求,ASP.NET MVC上就可以使用自定义的ActionFilter来实现,从上面的介绍,就知道我们需要重写OnActionExecuting ConfigurationManager.AppSettings["TimingEnabled"]); private Stopwatch timer; public override void OnActionExecuting (ActionExecutingContext filterContext) { base.OnActionExecuting(filterContext
操作筛选器可以实现接口IActionFilter,在接口中有两个方法,OnActionExecuting 在调用操作方法之前执行。 OnActionExecuted 在操作方法返回之后执行。 ; } public void OnActionExecuting(ActionExecutingContext context) { ; } public override void OnActionExecuting(ActionExecutingContext context) { ; } public override void OnActionExecuting(ActionExecutingContext context) { ; } public override void OnActionExecuting(ActionExecutingContext context) {
/// <param name="filterContext">重写方法的参数</param> protected override void OnActionExecuting (ActionExecutingContext filterContext) { base.OnActionExecuting(filterContext);
AllowMultiple = true)] public class WebApiAttribute : ActionFilterAttribute { public override void OnActionExecuting actionContext) { //API执行前触发 if (true)//当前设置,所有API都可以被调用 { base.OnActionExecuting 在执行真正WebApi之前,会先进入这里进行过滤,过滤通过的API,才会调用 base.OnActionExecuting(actionContext)方法进行调用和执行。
public class LogAttribute : ActionFilterAttribute { public override void OnActionExecuting actionContext.ActionDescriptor.ActionName + "进入执行:", Utils.SerializeObject(actionContext.ActionArguments)); base.OnActionExecuting
在命名空间:System.Web.Http.Filters中,重写OnActionExecuted(HttpActionExecutedContext actionExecutedContext) 和OnActionExecuting private readonly string Key = "_thisWebApiOnActionMonitorLog_"; public override void OnActionExecuting (HttpActionContext actionContext) { base.OnActionExecuting(actionContext);
Action过滤器 public class CompressAttribute:ActionFilterAttribute { public override void OnActionExecuting response.Filter, CompressionMode.Compress); } } } } 代码很简单了,就是重写了过滤器中的OnActionExecuting 就是在Action每次执行前先执行OnActionExecuting。