Asp.net MVC生命周期
2009-06-01 08:25
405 查看
Asp.net应用程序管道处理用户请求时特别强调"时机",对Asp.net生命周期的了解多少直接影响我们写页面和控件的效率。因此在2007年和2008年我在这个话题上各写了一篇文章:
《日志不说谎--Asp.net的生命周期》
《日志不说谎--Asp.net的生命周期 【结题】》
《两个粒度看Asp.net生命周期》
对于Asp.net MVC,我对它的生命周期还是兴趣很浓,于是提出两个问题:
一个HTTP请求从IIS移交到Asp.net运行时,Asp.net MVC是在什么时机获得了控制权并对请求进行处理呢?处理过程又是怎样的?
public virtual void PostResolveRequestCache(HttpContextBase context)
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完成后续的生命周期.
嗯哼,全文完.
最后跑题一句:要找工作了,有好机会联系我:mailto:ligaoren@gmail.com
《日志不说谎--Asp.net的生命周期》
《日志不说谎--Asp.net的生命周期 【结题】》
《两个粒度看Asp.net生命周期》
对于Asp.net MVC,我对它的生命周期还是兴趣很浓,于是提出两个问题:
一个HTTP请求从IIS移交到Asp.net运行时,Asp.net MVC是在什么时机获得了控制权并对请求进行处理呢?处理过程又是怎样的?
public virtual void PostResolveRequestCache(HttpContextBase context)
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完成后续的生命周期.
嗯哼,全文完.
最后跑题一句:要找工作了,有好机会联系我:mailto:ligaoren@gmail.com
相关文章推荐
- asp.net页面生命周期详解——帮助理解asp.netMVC原理
- ASP.NET MVC生命周期介绍
- asp.net MVC 应用程序的生命周期
- asp.net mvc的生命周期{转}
- Asp.Net & MVC 生命周期
- ASP.NET MVC生命周期介绍
- 【翻译】ASP.NET MVC深度接触:ASP.NET MVC请求生命周期
- asp.net MVC 应用程序的生命周期
- ASP.NET MVC 请求生命周期
- ASP.NET MVC生命周期介绍
- ASP.NET MVC请求处理管道生命周期的19个关键环节(1-6)
- 【MVC】ASP.NET MVC 请求生命周期
- 详解ASP.NET MVC的请求生命周期[转]
- ASP.NET MVC Preview生命周期分析
- ASP.NET MVC 请求生命周期
- ASP.NET MVC 生命周期
- ASP.NET MVC请求生命周期深入浅出详解
- asp.net mvc生命周期学习
- ASP.NET MVC生命周期介绍(转)
- Asp.net MVC生命周期