成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

ASP.NET MVC生命周期介紹

開發 后端
本文以IIS7中asp.net應用程序生命周期為例,介紹了asp.net mvc的生命周期。

asp.net應用程序管道處理用戶請求時特別強調"時機",對asp.net生命周期的了解多少直接影響我們寫頁面和控件的效率。對于asp.net mvc,我對它的生命周期興趣很濃,于是對ASP.NET MVC生命周期提出兩個問題:

一個HTTP請求從IIS移交到asp.net運行時,asp.net mvc是在什么時機獲得了控制權并對請求進行處理呢?處理過程又是怎樣的?

MSDN的一張HTTP請求處理過程發生事件的簡圖 

事件列表 

以IIS7中asp.net生命周期為例,上圖是來自MSDN的一張HTTP請求處理過程發生事件的簡圖,后面我列出了一個完整的事件列表。既然asp.net mvc還是以asp.net運行時為基礎那么它必然要在asp.net應用程序的生命周期中對請求進行截獲。第一反應當然是去web.config里面去翻翻,我們可以看到UrlRoutingModule的配置節:

       < add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>

  下面要做的就順理成章了,用Reflector打開這個程序集,可以看到以下代碼: 

  1. protected virtual void Init(HttpApplication application)  
  2.     {  
  3.         application.PostResolveRequestCache += new EventHandler(this.OnApplicationPostResolveRequestCache);  
  4.         application.PostMapRequestHandler += new EventHandler(this.OnApplicationPostMapRequestHandler);  
  5.     }  

看到這里我們的第一個問題實際上已經有了答案:時機是在PostResolveRequestCache和PostMapRequestHandler.

我們使用VS2008中asp.net mvc模板創建一個Demo完成后續的討論,當我們訪問/Home的時候發生了什么呢?

1、Request 請求到來

2、IIS 根據請求特征將處理權移交給 asp.net

3、UrlRoutingModule將當前請求在 Route Table中進行匹配

4、UrlRoutingModule在RouteCollection中查找Request匹配的RouteHandler,默認是mvcRouteHandler mvcRouteHandler 創建 mvcHandler實例.

5、mvcHandler執行 ProcessRequest.

6、mvcHandler 使用 IControllerFactory 獲得實現了IController接口的實例,找到對應的HomeController

7、根據Request觸發HomeController的Index方法

8、Index將執行結果存放在ViewData

9、HomeController的Index方法返回 ActionResult

10、Views/Home/Index.aspx將 ViewData呈現在頁面上

11、Index.aspx執行ProcessRequest方法

12、Index.aspx執行Render方法 輸出到客戶端

通過閱讀asp.net mvc的源碼,我們可以得到更為詳細的處理過程,我盡可能的忽略掉枝節,強調請求處理的流程.我們從Global.asax.cs文件切入,下面是一段樣例代碼,這里初始化了路由表,請特別特別注意注釋部分:

   

  1. public class mvcApplication : System.Web.HttpApplication  
  2.      {  
  3.          public static void RegisterRoutes(RouteCollection routes)  
  4.          {  
  5.              routes.IgnoreRoute("{resource}.axd/{*pathInfo}");  
  6.               
  7.              //The controller route value is a special value that the System.Web.mvc.mvcHandler class uses to call into the IControllerFactory interface.  
  8.              //The basic route handler is an instance of IRouteHandler named mvcRouteHandler.  
  9.              //We have complete control and could provide our own implementation of IRouteHandler if we wished.  
  10.              routes.MapRoute(  
  11.                  "Default",                                              // Route name  
  12.                  "{controller}/{action}/{id}",                           // URL with parameters  
  13.                  new { controller = "Home", action = "Index", id = "" }  // Parameter defaults  
  14.              );  
  15.             
  16.    
  17.          }  
  18.    
  19.          protected void Application_Start()  
  20.          {  
  21.              RegisterRoutes(RouteTable.Routes);  
  22.          }  

UrlRoutingMoudule在PostResolveRequestCache階段從RouteCollection中獲取當前請求的RouteData.RouteData包含了一個請求處理對應的Controller和Action,RouteData這個作用貫穿請求的處理過程.RouteData中提取RouteHandler,這里默認是mvcRouteHandler,mvcRouteHandler獲取HttpHandler,這里默認的是mvcHandler.

 

  1. PostResolveRequestCache  
  2.     public virtual void PostResolveRequestCache(HttpContextBase context)  
  3. {  
  4.     RouteData routeData = this.RouteCollection.GetRouteData(context);  
  5.     if (routeData != null)  
  6.     {  
  7.         IRouteHandler routeHandler = routeData.RouteHandler;  
  8.         if (routeHandler == null)  
  9.         {  
  10.             throw new InvalidOperationException(string.Format(CultureInfo.CurrentUICulture, RoutingResources.UrlRoutingModule_NoRouteHandler, new object[0]));  
  11.         }  
  12.         if (!(routeHandler is StopRoutingHandler))  
  13.         {  
  14.             RequestContext requestContext = new RequestContext(context, routeData);  
  15.             IHttpHandler httpHandler = routeHandler.GetHttpHandler(requestContext);  
  16.             if (httpHandler == null)  
  17.             {  
  18.                 throw new InvalidOperationException(string.Format(CultureInfo.CurrentUICulture, RoutingResources.UrlRoutingModule_NoHttpHandler, new object[] { routeHandler.GetType() }));  
  19.             }  
  20.             RequestData data2 = new RequestData();  
  21.             data2.OriginalPath = context.Request.Path;  
  22.             data2.HttpHandler = httpHandler;  
  23.             context.Items[_requestDataKey] = data2;  
  24.             context.RewritePath("~/UrlRouting.axd");  
  25.         }  
  26.     }  
  27. }  

執行程序 

mvcHandler.ProcessRequest()中首先使用HttpContextWrapper對HttpContext進行封裝,封裝的目的是為了解耦以獲得可測試性.然后從RequestContext.RouteData中提取Controller名稱.

ControllerBuilder.GetControllerFactory --> ControllerFactory.CreateController --> IController.Execute

ControllerBase實現了IController接口,在Initialize時將RequestContext封裝成為ControllerContext,Controller繼承自ControllerBase并實現抽象方法ExecuteCore()

 執行程序

在ExecuteCore中,Controller首先從RouteData中獲得ActionName,然后執行ActionInvoker.InvokeAction.

在ActionInvoker中我們可以看到各種Filter,這是一種AOP實踐:在Action方法執行的前后執行若干方法.這里有四種Filter:ActionFilters,ResultFilters,AuthorizationFilters,ExceptionFilters.這四種Filter并不是封閉的,都有對應的接口,這四個只是默認實現.Filter的執行順序是:AuthorizationFilter--->Action Filter.OnActionExecuting--->Action Method--->ActionFilter.OnActionExecuted.InvokeActionMethodWithFilters返回的結果是ActionExecutedContext,接下來將Controller執行OnResultExecuting 方法.ActionResult執行的結果可以是ViewResult,JsonResult,RedirectResult,ContentResult,或者是自定義的Result類型.

如果返回的類型是ViewResult,我們先看一下ViewReuslt的繼承關系:ViewResult-->ViewResultBase-->ActionResult,ViewResult包含兩個屬性View和ViewEngineCollection,實際上是包含了兩個接口的實現:IViewEngine定義了怎么定位View/Partial View.IView定義了如何RenderView.默認的實現時WebFormView和WebFormViewEngine.

Filter OnResultExecuted 最后一步了,可以這里捕獲異常.上面我們說過還有ExceptionFilters,如果前面過程中的異常沒有被捕獲那么最終都會到冒泡到ExceptionFilters.

RouteData中獲得ActionName

ActionInvoker.InvokeAction

通過ControllerContext獲取ControllerDescriptor

FindAction-獲取ActionDescriptor

GetFilters

ModelBinder把Request中的數據轉換成Action方法需要的參數

AuthorizationFilter

Action Filter.OnActionExecuting

Action

ActionFilter.OnActionExecuted

ResultFilter.OnResultExecuting

ActionResult Execution

ResultFilter.OnResultExecuted

WebFormViewEngine.CreateView

WebFormView.Render

ResultFilter.OnExecuted

 

生命周期  

控制權歸還到HttpApplication完成后續的asp.net mvc生命周期。

【編輯推薦】

  1. ASP.NET數組基礎:聲明,表示及范例
  2. ASP.NET編程中的十大技巧(二)
  3. ASP.NET編程中的十大技巧(一)
  4. ASP.NET MVC教程(一):準備工作
  5. ASP.NET MVC Beta的部署問題

 

責任編輯:book05 來源: cnblogs
相關推薦

2009-07-20 10:33:02

ASP.NET MVC

2009-08-04 16:50:15

ASP.NET頁面生命

2009-02-12 13:16:55

請求生命周期MVCASP.NET

2009-07-23 10:23:44

2013-04-07 10:42:56

Asp.Net頁面周期

2009-08-04 16:05:15

ASP.NET頁面生命

2009-07-31 10:47:18

ASP.NET頁面生命

2010-04-02 09:02:02

ASP.NET MVC

2009-07-23 18:55:17

ASP.NET頁生命周

2009-08-03 14:18:40

ASP.NET編程模型ASP.NET頁面生命

2009-08-04 17:49:31

Web Page生命周ASP.NET Pos

2009-08-10 14:31:46

ASP.NET組件設計ASP.NET控件生命

2009-07-20 10:53:59

ASP.NET MVC

2012-08-16 09:38:38

ASP.NET

2009-07-28 09:46:53

ASP.NET服務器控

2011-06-21 10:26:37

2009-07-20 15:44:32

ASP.NET MVC

2021-04-26 09:22:07

ASP.NET Cor服務周期

2009-08-03 14:37:38

ASP.NET編程模型頁面生命周期

2009-07-31 17:53:39

ASP.NET線程安全
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久无码国产精品一区 | 欧美精品久久久久久久久老牛影院 | 日韩欧美国产精品 | 午夜亚洲| 97伊人| 热re99久久精品国99热观看 | 妞干网av| 国产日韩精品视频 | av网站免费观看 | 狠狠躁夜夜躁人人爽天天高潮 | 四虎影视一区二区 | 欧美成年黄网站色视频 | 久久99蜜桃综合影院免费观看 | 青青久久| 免费观看www| 免费在线观看av的网站 | 欧美精品日韩 | 天天综合91| 国产99久久久国产精品 | 久久国产精品色av免费观看 | 狠狠色狠狠色综合系列 | 亚洲成人三区 | 羞羞的视频在线 | 狠狠操狠狠搞 | 国产91在线观看 | 欧美一级高潮片免费的 | 一区二区影视 | 欧美日韩一区二区三区不卡视频 | 亚洲在线一区二区三区 | 91久久国产精品 | 欧美一级做性受免费大片免费 | 激情亚洲 | 精品无码久久久久久国产 | 一区二区免费 | 国产一在线 | 色综合视频 | 精品国偷自产在线 | 亚洲精品中文字幕av | 中文字幕亚洲欧美日韩在线不卡 | www日本高清视频 | 国产欧美日韩一区二区三区在线 |