<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      asp.net mvc 之旅 —— 第六站 ActionFilter的應(yīng)用及源碼分析

        

           這篇文章我們開始看一下ActionFilter,從名字上其實(shí)就大概知道ActionFilter就是Action上的Filter,對(duì)吧,那么Action上的Filter大概有幾個(gè)呢???

      這個(gè)問題其實(shí)還是蠻簡單的,因?yàn)槲覀兟犝fMvc本身就是一個(gè)擴(kuò)展性極強(qiáng)的框架,自然就是層層有攔截,層層有過濾,對(duì)吧,比如我們看到的如下Controller類。

          public abstract class Controller : ControllerBase, IActionFilter, IAuthenticationFilter, IAuthorizationFilter, IDisposable, IExceptionFilter, IResultFilter, IAsyncController, IController, IAsyncManagerContainer
          {
          }

      從這個(gè)父類的Controller中,我們就可以看到有5個(gè)Filter,如:IActionFilter,IAuthenticationFilter,IAuthorizationFilter,IExceptionFilter,IResultFilter,

      對(duì)吧,首先我們還是從第一個(gè)ActionFilter說起。

       

      一:IActionFilter解析

        現(xiàn)在我們知道IActionFilter是一個(gè)接口,接下來感興趣的就是這個(gè)ActionFilter里面到底是什么,比如我下面截圖的這樣。

          //
          // 摘要:
          //     Defines the methods that are used in an action filter.
          public interface IActionFilter
          {
              //
              // 摘要:
              //     Called after the action method executes.
              //
              // 參數(shù):
              //   filterContext:
              //     The filter context.
              void OnActionExecuted(ActionExecutedContext filterContext);
              //
              // 摘要:
              //     Called before an action method executes.
              //
              // 參數(shù):
              //   filterContext:
              //     The filter context.
              void OnActionExecuting(ActionExecutingContext filterContext);
          }

       從上面這段代碼中,我們可以看到其實(shí)這個(gè)接口里面只有兩個(gè)方法,一個(gè)是OnActionExecuting,一個(gè)是OnActionExecuted,看這名字你應(yīng)該就明白

      其實(shí)就是在Action的前后分別執(zhí)行,對(duì)吧,那這樣的話,聰明的你就想到了應(yīng)用場景,記錄日志,獲取action的訪問量,以方便后續(xù)收費(fèi)~~~ 接下來我

      們來看看怎么來實(shí)現(xiàn)這兩個(gè)方法。

       

      1.  用override的方式實(shí)現(xiàn)ActionFilter

           現(xiàn)在大家都知道Controller類已經(jīng)實(shí)現(xiàn)了這個(gè)接口,那我們自己的XXXController剛好又繼承了這個(gè)父Controller,所以面對(duì)這種情況,我們可以用

      override來實(shí)現(xiàn),比如下面我實(shí)現(xiàn)的這樣。

       1     public class HomeController : Controller
       2     {
       3         public ActionResult Index()
       4         {
       5             return View();
       6         }
       7 
       8         protected override void OnActionExecuting(ActionExecutingContext filterContext)
       9         {
      10             filterContext.HttpContext.Response.Write("hello");
      11 
      12             base.OnActionExecuting(filterContext);
      13         }
      14 
      15         protected override void OnActionExecuted(ActionExecutedContext filterContext)
      16         {
      17             filterContext.HttpContext.Response.Write("world");
      18 
      19             base.OnActionExecuted(filterContext);
      20         }
      21     }

      就這樣我們就輕松加愉快的實(shí)現(xiàn)了,是不是很簡單,但是仔細(xì)一想,這樣的方法還是有一點(diǎn)限制的,也就是說我們override的依賴性太強(qiáng)了,比如說只有

      class extends IActionFilter才可以,接下來我們?cè)倏从袥]有更靈活的方法來實(shí)現(xiàn)。

       

      2.  自定義class extends IActionFilter

          要想做到高度的靈活性,我們必須將這個(gè)實(shí)現(xiàn)類做成一個(gè)“原子單位”,有了這個(gè)原子單位,我們就可以很方便的將這個(gè)不可拆解的原子性應(yīng)用到各個(gè)地方

      去,對(duì)吧,這個(gè)原子在C#中可以用Attribute來實(shí)現(xiàn),比如下面這樣:

       1     public class MyActionFilterAttribute : Attribute, IActionFilter
       2     {
       3         public void OnActionExecuted(ActionExecutedContext filterContext)
       4         {
       5             filterContext.HttpContext.Response.Write("hello");
       6         }
       7 
       8         public void OnActionExecuting(ActionExecutingContext filterContext)
       9         {
      10             filterContext.HttpContext.Response.Write("world");
      11         }
      12     }

       

      ok,現(xiàn)在我們已經(jīng)得到了一個(gè)原子性質(zhì)的MyActionFilterAttribute特性,接下來我們可以將這個(gè)MyActionFilterAttribute應(yīng)用到任何地方,如下圖:

      1     public class HomeController : Controller
      2     {
      3         [MyActionFilter]
      4         public ActionResult Index()
      5         {
      6             return View();
      7         }
      8     }

       

      3.  ActionFilterAttribute

           除了我們實(shí)現(xiàn)以下Attribute特性和IActionFilter接口,我們還可以繼承一個(gè)mvc框架提供給我們的ActionFilterAttribute特性,迫不及待的看一下吧~

       1     //
       2     // 摘要:
       3     //     Represents the base class for filter attributes.
       4     [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
       5     public abstract class ActionFilterAttribute : FilterAttribute, IActionFilter, IResultFilter
       6     {
       7         //
       8         // 摘要:
       9         //     Initializes a new instance of the System.Web.Mvc.ActionFilterAttribute class.
      10         protected ActionFilterAttribute();
      11 
      12         //
      13         // 摘要:
      14         //     Called by the ASP.NET MVC framework after the action method executes.
      15         //
      16         // 參數(shù):
      17         //   filterContext:
      18         //     The filter context.
      19         public virtual void OnActionExecuted(ActionExecutedContext filterContext);
      20         //
      21         // 摘要:
      22         //     Called by the ASP.NET MVC framework before the action method executes.
      23         //
      24         // 參數(shù):
      25         //   filterContext:
      26         //     The filter context.
      27         public virtual void OnActionExecuting(ActionExecutingContext filterContext);
      28         //
      29         // 摘要:
      30         //     Called by the ASP.NET MVC framework after the action result executes.
      31         //
      32         // 參數(shù):
      33         //   filterContext:
      34         //     The filter context.
      35         public virtual void OnResultExecuted(ResultExecutedContext filterContext);
      36         //
      37         // 摘要:
      38         //     Called by the ASP.NET MVC framework before the action result executes.
      39         //
      40         // 參數(shù):
      41         //   filterContext:
      42         //     The filter context.
      43         public virtual void OnResultExecuting(ResultExecutingContext filterContext);
      44     }

       

      從這個(gè)Attribute中可以看到,它整合了IActionFilter, IResultFilter,自然就有了這兩個(gè)接口的方法,好了,不多說,我們來實(shí)現(xiàn)一下這個(gè)抽象類吧。

      namespace WebApplication2.Controllers
      {
          public class HomeController : Controller
          {
             [MyActionFilter]
             public ActionResult Index()
              {
                  return View();
              }
          }
      
          public class MyActionFilterAttribute : ActionFilterAttribute
          {
              public override void OnActionExecuting(ActionExecutingContext filterContext)
              {
                  base.OnActionExecuting(filterContext);
              }
      
              public override void OnActionExecuted(ActionExecutedContext filterContext)
              {
                  base.OnActionExecuted(filterContext);
              }
          }
      }

       

      二:源碼分析

           最好的源碼分析方法,肯定是希望你下載一個(gè)reflector插件,這樣我們就可以獲取到運(yùn)行時(shí)的可調(diào)試代碼以及可以看到的調(diào)用堆棧,尤其是”調(diào)用堆

      棧“,對(duì)你來說非常的重要。

       

      1. 首先我們下一個(gè)斷點(diǎn)在 OnActionExecuting方法里面,如下圖:

       

      2. 通過調(diào)用堆棧回退到上一個(gè)堆棧,如圖:

       

      這個(gè)方法其實(shí)非常的有意思,從方法名稱中可以看到,其實(shí)它是一個(gè)遞歸的模式,也就是”O(jiān)nActionExecuting" =>"進(jìn)棧執(zhí)行BeginInvokeActionMethod”

      =>"退棧執(zhí)行OnActionExecuted“方法,因?yàn)橛幸粋€(gè)非常好看的statement,比如: 

      Func<ActionExecutedContext> continuation = this.InvokeActionMethodFilterAsynchronouslyRecursive(num);

       

      好了,更多的細(xì)節(jié)等待你去考究,希望本篇文章對(duì)您有幫助~~~

       

      posted @ 2016-07-14 17:25  一線碼農(nóng)  閱讀(3975)  評(píng)論(2)    收藏  舉報(bào)
      主站蜘蛛池模板: 麻豆国产va免费精品高清在线| 潮喷失禁大喷水无码| 两当县| 国产尤物精品自在拍视频首页| 日韩中文字幕有码午夜美女| 亚洲永久精品ww47永久入口| 中文字幕理伦午夜福利片| 国产无码高清视频不卡| 国产啪视频免费观看视频| 蜜桃麻豆www久久囤产精品| 加勒比亚洲天堂午夜中文| 亚洲中文字幕国产精品| 337p日本欧洲亚洲大胆色噜噜| 国产亚洲欧美精品久久久| 国产午夜福利视频一区二区| 欧美视频免费一区二区三区| 日本一区不卡高清更新二区 | 欧美videos粗暴| 一级女性全黄久久生活片| 91超碰在线精品| 国产精品久久欧美久久一区| 国产精品成人一区二区三| 黑人av无码一区| 日本高清在线播放一区二区三区| 日韩精品一区二区都可以| 18禁亚洲一区二区三区| 国产成人精品一区二区三区免费 | 亚洲日韩国产精品第一页一区| 美女爽到高潮嗷嗷嗷叫免费网站| 精品一区二区三区在线观看l| 日本一道本高清一区二区| 亚洲av日韩av综合在线观看| 影音先锋大黄瓜视频| 国产在线精品第一区二区| 国产精品v片在线观看不卡| 亚洲男人电影天堂无码| 4hu44四虎www在线影院麻豆| 无码国产偷倩在线播放老年人| 亚洲一区二区三区黄色片| julia无码中文字幕一区| 国产a在视频线精品视频下载|