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

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

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

      ASP.NET MVC涉及到的5個同步與異步,你是否傻傻分不清楚?[上篇]

      Action方法的執行具有兩種基本的形式,即同步執行和異步執行,而在ASP.NETMVC的整個體系中涉及到很多同步/異步的執行方式,雖然在前面相應的文章中已經對此作了相應的介紹,為了讓讀者對此有一個整體的了解,我們來做一個總結性的論述。[本文已經同步到《How ASP.NET MVC Works?》中]

      目錄
      一、MvcHandler的同步于異步
      二、Controller的同步與異步
      三、ActionInvoker的同步與異步
      四、ControllerDescriptor的同步與異步
      五、ActionDescriptor的同步與異步

      一、MvcHandler的同步與異步

      對于ASP.NET MVC應用來說,MvcHandler是最終用于處理請求的HttpHandler,它是通過UrlRoutingModule這個實現了URL路由的HttpModule被動態映射到相應的請求的。MvcHandler借助于ControllerFactory激活并執行目標Controller,并在執行結束后負責對激活的Controller進行釋放,相關的內容請參與本書的第3章“Controller的激活”。如下面的代碼片斷所示,MvcHandler同時實現了IHttpHandler和IHttpAsyncHandler接口,所以它總是調用BeginProcessRequest/EndProcessRequest方法以異步的方式來處理請求

         1: public class MvcHandler : IHttpAsyncHandler, IHttpHandler, ...
         2: {
         3:     //其他成員   
         4:     IAsyncResult IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData);
         5:     void IHttpAsyncHandler.EndProcessRequest(IAsyncResult result);
         6:     void IHttpHandler.ProcessRequest(HttpContext httpContext);
         7: }

      二、Controller的同步與異步

      Controller也具有同步與異步兩個版本,它們分別實現了具有如下定義的兩個接口IController和IAsyncController。當激活的Controller對象在MvcHandler的BeginProcessRequest方法中是按照這樣的方式執行的:如果Controller的類型實現了IAsyncController接口,則調用BeginExecute/EndExecute方法以異步的方式執行Controller;否則Controller的執行通過調用Execute方法以同步方式執行

         1: public interface IController
         2: {    
         3:     void Execute(RequestContext requestContext);
         4: }
         5: public interface IAsyncController : IController
         6: {    
         7:     IAsyncResult BeginExecute(RequestContext requestContext, AsyncCallback callback, object state);
         8:     void EndExecute(IAsyncResult asyncResult);
         9: }

      默認情況下通過Visual Studio的向導創建的Controller類型是抽象類型Controller的子類。如下面的代碼片斷所示,Controller同時實現了IController和IAsyncController這兩個接口,所以當MvcHandler進行請求處理時總是以異步的方式來執行Controller。

         1: public abstract class Controller : ControllerBase, IController, IAsyncController, ...
         2: {
         3:     //其他成員
         4:     protected virtual bool DisableAsyncSupport
         5:     {
         6:         get{return false;}
         7:     }
         8: }

      但是Controller類型具有一個受保護的只讀屬性DisableAsyncSupport用于表示是否禁用對異步執行的支持。在默認情況下,該屬性值為False,所以默認情況下是支持Controller的異步執行的。如果我們通過重寫該屬性將值設置為True,那么Controller將只能以同步的方式執行。具體的實現邏輯體現在如下的代碼片斷中:BeginExecute方法在DisableAsyncSupport屬性為True的情況下通過調用Execute方法(該方法會調用一個受保護的虛方法ExecuteCore最終對Controller進行同步執行);否則通過調用BeginExecuteCore/EndExecuteCore以異步方式執行Controller。

         1: public abstract class Controller: ...
         2: {
         3:     //其他成員
         4:     protected virtual IAsyncResult BeginExecute(RequestContext requestContext, 
         5:     AsyncCallback callback, object state)
         6:     {
         7:         if (this.DisableAsyncSupport)
         8:         {
         9:             //通過調用Execute方法同步執行Controller
        10:         }
        11:         else
        12:         {
        13:             //通過調用BeginExecuteCore/EndExecuteCore方法異步執行Controller
        14:         }
        15: }
        16:     protected override void ExecuteCore();
        17:     protected virtual IAsyncResult BeginExecuteCore(AsyncCallback callback, object state);
        18:     protected virtual void EndExecuteCore(IAsyncResult asyncResult);
        19: }

      三、 ActionInvoker的同步與異步

      包括Model綁定與驗證的整個Action的執行通過一個名為ActionInvoker的組件來完成,而它同樣具有同步和異步兩個版本,分別實現了接口IActionInvoker和IAsyncActionInvoker。如下面的代碼片斷所示,這兩個接口分別通過InvokeAction和BeginInvokeAction/EndInvokeAction方法以同步和異步的方式執行Action。抽象類Controller中具有一個ActionInvoker屬性用于設置和返回用于執行自身Action的ActionInvoker對象,而該對象最終是通過受保護需方法CreateActionInvoker創建的。

         1: public interface IActionInvoker
         2: {
         3:     bool InvokeAction(ControllerContext controllerContext, string actionName);
         4: }
         5:  
         6: public interface IAsyncActionInvoker : IActionInvoker
         7: {
         8:     IAsyncResult BeginInvokeAction(ControllerContext controllerContext, string actionName, AsyncCallback callback, object state);
         9:     bool EndInvokeAction(IAsyncResult asyncResult);
        10: }
        11:  
        12: public abstract class Controller
        13: {   
        14:     //其它成員
        15:     public IActionInvoker ActionInvoker { get; set; }
        16:     protected virtual IActionInvoker CreateActionInvoker()
        17: }

      ASP.NET MVC真正用于Action方法同步和異步執行的ActionInvoker分別是ControllerActionInvoker和AsyncControllerActionInvoker。如下面的代碼片斷所示,ControllerActionInvoker定義了一個受保護的方法GetControllerDescriptor用于根據指定的Controller上下文獲取相應的ControllerDescriptor,它的子類AsyncControllerActionInvoker對這個方法進行了重寫。

         1: public class ControllerActionInvoker : IActionInvoker
         2: {
         3:     //其它成員
         4:     protected virtual ControllerDescriptor GetControllerDescriptor(ControllerContext controllerContext);
         5: }
         6:  
         7: public class AsyncControllerActionInvoker : ControllerActionInvoker,IAsyncActionInvoker, IActionInvoker
         8: {
         9:     //其它成員
        10:    protected override ControllerDescriptor GetControllerDescriptor(ControllerContext controllerContext);
        11: }

      我們所有要了解的是在默認情況下(沒有對Controller類型的ActionInvoker屬性進行顯式設置)采用的ActionInvoker類型是哪個。ASP.NET MVC對Conroller采用的ActionInvoker類型的選擇機制是這樣的:

      • 通過當前的DependencyResolver以IAsyncActionInvoker接口去獲取注冊的ActionInvoker,如果返回對象不為Null,則將其作為默認的ActionInvoker。
      • ·通過當前的DependencyResolver以IActionInvoker接口去獲取注冊的ActionInvoker,如果返回對象不為Null,則將其作為默認的ActionInvoker。
      • 創建AsyncControllerActionInvoker對象作為默認的ActionInvoker。

      在默認的情況下,當前的DependencyResolver直接通過對指定的類型進行反射來提供對應的實例對象,所以對于前面兩個步驟返回的對象均為Null,所以默認創建出來的ActionInvoker類型為AsyncControllerActionInvoker。我們可以通過如下一個簡單的實例來驗證這一點。在通過Visual Studio的ASP.NET MVC項目模板創建的空Web應用中,我們創建了如下一個默認的HomeController,在Action方法Index中直接通過ContentResult將ActionInvoker屬性的類型名稱呈現出來。

         1: public class HomeController : Controller
         2: {  
         3:     public ActionResult Index()
         4:     {
         5:         return Content("默認ActionInvoker類型:" + this.ActionInvoker.GetType().FullName);
         6:     }
         7: }

      當運行該Web應用時,會在瀏覽器上產生如下的輸出結果,我們可以清楚地看到默認采用的ActionInvoker類型正是AsyncControllerActionInvoker。

         1: 默認ActionInvoker類型:System.Web.Mvc.Async.AsyncControllerActionInvoker

      為了進一步驗證基于DependencyResolver對ActionInvoker的提供機制,我們將《ASP.NET MVC Controller激活系統詳解:IoC的應用[下篇]》創建的基于Ninject的自定義NinjectDependencyResolver應用在這里。如下面的代碼片斷所示,在初始化NinjectDependencyResolver的時候,我們將IActionInvoker和IAsyncActionInvoker影射到兩個自定義ActionInvoker類型,即FooActionInvoker和FooAsyncActionInvoker,它們分別繼承自ControllerActionInvoker和AsyncControllerActionInvoker。

         1: public class NinjectDependencyResolver : IDependencyResolver
         2: {
         3:     public IKernel Kernel { get; private set; }
         4:     public NinjectDependencyResolver()
         5:     {
         6:         this.Kernel = new StandardKernel();
         7:         AddBindings();
         8:     }
         9:     private void AddBindings()
        10:     {
        11:         this.Kernel.Bind<IActionInvoker>().To<FooActionInvoker>();
        12:         this.Kernel.Bind<IAsyncActionInvoker>().To<FooAsyncActionInvoker>();
        13:     }
        14:     public object GetService(Type serviceType)
        15:     {
        16:         return this.Kernel.TryGet(serviceType);
        17:     }
        18:     public IEnumerable<object> GetServices(Type serviceType)
        19:     {
        20:         return this.Kernel.GetAll(serviceType);
        21:     }
        22: }
        23: public class FooActionInvoker : ControllerActionInvoker
        24: {}
        25: public class FooAsyncActionInvoker : AsyncControllerActionInvoker
        26: {}

      在Global.asax中對NinjectDependencyResolver進行注冊后運行我們的程序,會在瀏覽器中得到如下的輸出結果。IAsyncActionInvoker和FooAsyncActionInvoker進行了影射,NinjectDependencyResolver可以通過IAsyncActionInvoker提供一個FooAsyncActionInvoker實例。

         1: 默認ActionInvoker類型:Artech.Mvc.FooAsyncActionInvoker

      現在我們對NinjectDependencyResolver的定義稍加修改,將針對IAsyncActionInvoker接口的類型影射刪除,只保留針對IActionInvoker的映射。

         1: public class NinjectDependencyResolver : IDependencyResolver
         2: {
         3:     //其它成員
         4:     private void AddBindings()
         5:     {
         6:         this.Kernel.Bind<IActionInvoker>().To<FooActionInvoker>();
         7:         //this.Kernel.Bind<IAsyncActionInvoker>().To<FooAsyncActionInvoker>();
         8:     }
         9: }

      再次運行我們的程序則會得到如下的輸出結果。由于NinjectDependencyResolver只能通過IActionInvoker接口提供具體的ActionInvoker,所以最終被創建的是一個FooActionInvoker對象。這個實例演示告訴我們:當我們需要使用到自定義的ActionInvoker的時候,可以通過自定義DependencyResolver以IoC的方式提供具體的ActionInvoker實例。

         1: 默認ActionInvoker類型:Artech.Mvc.FooActionInvoker

       

      ASP.NET MVC涉及到的5個同步與異步,你是否傻傻分不清楚?[上篇]
      ASP.NET MVC涉及到的5個同步與異步,你是否傻傻分不清楚?[下篇]

      posted @ 2012-06-21 09:34  Artech  閱讀(12884)  評論(20)    收藏  舉報
      主站蜘蛛池模板: 欧美激欧美啪啪片| jizz国产免费观看| 亚洲无av中文字幕在线| 久久人人97超碰精品| 亚洲一二三四区中文字幕| 日韩一区在线中文字幕| 久章草在线毛片视频播放| 国产精品va无码一区二区| 国产大陆av一区二区三区| 亚洲中文字幕无码av永久| 国产美女直播亚洲一区色| 国产成人综合欧美精品久久| 亚洲精品国模一区二区| 国产JJIZZ女人多水喷水| 国产精品高清国产三级囯产AV| 亚洲国产精品综合色在线| 亚洲国产精品人人做人人爱| 亚洲精品一区二区二三区| 大陆精大陆国产国语精品| 中文字幕久久熟女蜜桃| 精品人妻少妇一区二区三区| 综合色久七七综合尤物| 亚洲av专区一区| 久青草国产在视频在线观看| 精品av综合导航| 亚洲国产欧美在线看片一国产| 亚洲av无码专区在线亚| 国产一区二区三区小说| 好吊视频专区一区二区三区| 欧美人伦禁忌dvd放荡欲情| 国产精品自拍实拍在线看| 青草青草久热精品视频在线观看 | 中文国产成人精品久久不卡| 国产人妻大战黑人第1集| 色噜噜一区二区三区| 亚洲男人的天堂久久香蕉| 精品乱码一区二区三四五区| 中国孕妇变态孕交xxxx| 亚洲人成网站在线观看播放不卡 | 天天做天天爱夜夜爽导航| 亚洲AV无码乱码在线观看性色扶 |