zoukankan      html  css  js  c++  java
  • Action拦截器接口-- IActionFilter,IExceptionFilter, IResultFilter

    MVC里的拦截器接口(也叫过滤器接口)

    1、IActionFilter(Action拦截器接口)
         Action拦截器分别在“执行Action之前”拦截和“执行Action之后”拦截,2个方法如下:

    // 摘要:
    //      Called after the action method executes.
    //
    // 参数:
    //    filterContext:
    //      The filter context.
    void OnActionExecuted(ActionExecutedContext filterContext);
    //
    // 摘要:
    //      Called before an action method executes.
    //
    // 参数:
    //    filterContext:
    //      The filter context.
    void OnActionExecuting(ActionExecutingContext filterContext);

    看摘要就可以区分出哪个是执行之前拦截和执行之后拦截了,我们只需要实现这个接口就可以在执行Action之前做些处理和执行Action之后做些“善后”处理了。。。。
    参数:filterContext 包含了执行整个Action的内容,我们可以取到我们想要的内容,如Action名称啦,一些参数等等。。。
    示例代码如:

         public void OnActionExecuted(ActionExecutedContext filterContext)
             {
                 filterContext.RequestContext.HttpContext.Response.Write(string.Format("Action({0})已经执行了!<br />"
                     ,filterContext.ActionDescriptor.ActionName));
             }
    
            public void OnActionExecuting(ActionExecutingContext filterContext)
             {
                 filterContext.RequestContext.HttpContext.Response.Write(string.Format("Action({0})执行之前!<br />"
                     ,filterContext.ActionDescriptor.ActionName));
             }

    2、 IResultFilter(Result拦截器接口)  

           IResultFilter 和 IActionFilter 一样提供2个方法,执行前和执行后,分别是在 返回Result之前执行和返回Result之后执行。接口中的2个方法如下:

    / 摘要:
    //      Called after an action result executes.
    //
    // 参数:
    //    filterContext:
    //      The filter context.
    void OnResultExecuted(ResultExecutedContext filterContext);
    //
    // 摘要:
    //      Called before an action result executes.
    //
    // 参数:
    //    filterContext:
    //      The filter context.
    void OnResultExecuting(ResultExecutingContext filterContext);

    参数:filterContext包含拦截到的Result等信息。。。
    示例代码如:
    region IResultFilter 成员

    public void OnResultExecuted(ResultExecutedContext filterContext)
    {    
        filterContext.RequestContext.HttpContext.Response.Write("Result已经执行了!");
    }
    
    public void OnResultExecuting(ResultExecutingContext filterContext)
    {
        filterContext.RequestContext.HttpContext.Response.Write("Result执行之前!");
    }

     这2个接口的区别很明显:一个拦截 Action、一个拦截Result(这不是废话嘛,哈哈),又因为Result是Action返回的,
    所以 他们的执行顺序是:
    OnActionExecuting–>Action中的代码–>OnActionExecuted–>OnResultExecuting–>OnResultExecuted
    由于拦截器的特性,大伙们现在喜欢用他们来做日志记录,判断权限等功能。。。。。
    当然做日志记录还经常要记录一些异常信息了。。

    3、IExceptionFilter(异常拦截器接口)  

    异常拦截器接口只有一个方法,就是当异常发生时需要执行的内容:

    // 摘要:
    //      Called when an exception occurs.
    //
    // 参数:
    //    filterContext:
    //      The filter context.
    void OnException(ExceptionContext filterContext);

     参数:filterContext包含异常等信息。。。
    示例代码如:
    region IExceptionFilter 成员

    public void OnException(ExceptionContext filterContext)
    {
       string controller = filterContext.RouteData.Values["controller"] as string;
    
       string action = filterContext.RouteData.Values["action"] as string;
    
       filterContext.RequestContext.HttpContext.Response.Write
       (string.Format("{0}:{1}发生异常!{2}", controller,action, filterContext.Exception.Message));
    
       filterContext.ExceptionHandled = true;
    }

    代码中显示了出错的Controller 、action 和异常信息。。。。此处你可以自定义重定向到错误页面去。。
    上面说到大伙们可能会用 IActionFilter做权限判断功能,其实我们可以用专业的 IAuthorizationFilter来做权限判断。。。

    4、IAuthorizationFilter(授权拦截器接口)  

    该拦截器专门用来判断权限,判断时候有权限执行后面的Action,此接口在任何拦截器之前执行。。。。。
    提供一个方法:

    // 摘要:
    //      Called when authorization is required.
    //
    // 参数:
    //    filterContext:
    //      The filter context.
    void OnAuthorization(AuthorizationContext filterContext);

     示例代码如:
    region IAuthorizationFilter 成员

    public void OnAuthorization(AuthorizationContext filterContext)
    {
        filterContext.HttpContext.Response.Write("执行authorization! 判断是否有权限。。。。<br />");
    } 

    完整示例代码:
    1、MyFilter.cs
    代码

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    
    namespace MvcApplication3
    {
        public class MyFilter : FilterAttribute, IActionFilter, IResultFilter, IExceptionFilter, IAuthorizationFilter
     {
      #region IActionFilter 成员
    
    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
        filterContext.RequestContext.HttpContext.Response.Write(string.Format("Action({0})已经执行了!<br />"
            ,filterContext.ActionDescriptor.ActionName));
    }
    
    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.RequestContext.HttpContext.Response.Write(string.Format("Action({0})执行之前!<br />"
            ,filterContext.ActionDescriptor.ActionName));
    } 
     #endregion
    
    
     #region IResultFilter 成员
    
    public void OnResultExecuted(ResultExecutedContext filterContext)
     {
         filterContext.RequestContext.HttpContext.Response.Write("Result已经执行了!");
     }
    
    public void OnResultExecuting(ResultExecutingContext filterContext)
     {
         filterContext.RequestContext.HttpContext.Response.Write("Result执行之前!");
     }
    
     #endregion
    
     #region IExceptionFilter 成员
    
    public void OnException(ExceptionContext filterContext)
     {
        string controller = filterContext.RouteData.Values["controller"] as string;
        string action = filterContext.RouteData.Values["action"] as string;
    
         filterContext.RequestContext.HttpContext.Response.Write(string.Format("{0}:{1}发生异常!{2}",
             controller,action, filterContext.Exception.Message));
         filterContext.ExceptionHandled = true;
     }
    
     #endregion
    
     #region IAuthorizationFilter 成员
    
    public void OnAuthorization(AuthorizationContext filterContext)
     {
         filterContext.HttpContext.Response.Write("执行authorization! 判断时候有权限。。。。<br />");
     }
    
     #endregion
    }
    }

     2、HomeController.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using MvcApplication3;
    
    namespace MvcApplication3.Controllers
    {
         [HandleError]
         [MyFilter]
    public class HomeController : Controller
    {
       public ActionResult Index()
        {
            ViewData["Message"] = "Welcome to ASP.NET MVC!";
    
           return View();
        }
    
       public ActionResult About()
        {
            Response.Write("执行about!<br />");
           throw new Exception("我是假的异常,呵呵");
    
           //return View();
        }
    }
    }
  • 相关阅读:
    记我安装Caffe的血泪史(1)
    UWP连接mysql 实现数据远程备份
    数据库性能测试
    性能瓶颈分析定位
    系统安全性测试
    WEB安全性测试点
    jmeter测试报告分析
    Linux常用命令大全
    软件测试入门到飞升上仙之客户端
    软件测试入门到飞升上仙之web 端测试
  • 原文地址:https://www.cnblogs.com/youmingkuang/p/13575690.html
Copyright © 2011-2022 走看看