[转载]ASP.NET MVC 请求生命周期

baacloud免费翻墙vpn注册使用

[转载]MVC 请求生命周期 – 展翅高飞 – 博客园.

当一个ASP.NET mvc应用程序提出请求,为了响应请求,包含一些请求执行流程步骤! 在ASP.NET mvc应用程序Http request
和Http response 过程中,主要包含8个步骤:
1)RouteTable(路由表)的创建
2)UrlRoutingModule 请求拦截
3)Routing engine 确定route
4)route handler 创建相关的IHttpHandler实例
5)IHttpHandler实例确定Controller(控制器)
6)Controller执行
7)一个视图引擎创建
8) 视图呈现
主要流程图如下:

1)RouteTable的创建
RouteTable的创建发生在mvc应用程序的启动 或者web应用程序池的重启!通常的asp.net程序,一个页面请求对应磁盘上的一个页面!如(http://localhost/index.aspx
对 应到服务器磁盘上的文件index.aspx)index.aspx实际上是一个类,由IHttpHandler创建实例化。IHttpHandler包 含一个
ProcessRequest方法,负责响应页面输出!

但是mvc application 是不同的,每一个请求映射到route,route 定义在route table,在应用程序启动时创建!

RouteTable的在应用程序的具体使用如下

代码

public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute(
{resource}.axd/{*pathInfo});

routes.MapRoute(

Default, // Route name
{controller}/{action}/{id}, // URL with parameters
new { controller = Home, action = Index, id = “” } // Parameter defaults
);
routes.MapRoute(
Account, // Route name
{controller}/{action}/{id}, // URL with parameters
new { controller = Account, action = LogOn, id = “” } // Parameter defaults
);

}

protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
}

2)UrlRoutingModule 请求拦截
每 一个Http 请求 都被UrlRoutingModule拦截,UrlRoutingModule提供了当前的HttpContext的routing engine(路由引擎)。HttpContext实例包含当前请求的所有数据。UrlRoutingModule控制着routing engine,提供了HttpContext数据到routing engine! UrlRoutingModule实现了IHttpModule接口,在web.config 文件进行了注册!

UrlRoutingModule 具体的数据结构如下:

代码


public class UrlRoutingModule : IHttpModule
{
// 主要的 Methods
protected virtual void Init(HttpApplication application);
private void OnApplicationPostMapRequestHandler(object sender, EventArgs e);
private void OnApplicationPostResolveRequestCache(object sender, EventArgs e);
public virtual void PostMapRequestHandler(HttpContextBase context);
public virtual void PostResolveRequestCache(HttpContextBase context);
void IHttpModule.Init(HttpApplication application);

// Properties
public RouteCollection RouteCollection { get; set; }

}
UrlRoutingModule 在 WebConfig的注册

<httpModules>
<add name=UrlRoutingModule type=System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0,

Culture=neutral,    PublicKeyToken=31BF3856AD364E35/>
</httpModules>

3)Routing engine 确定route
routing engine基于当前HttpContext确定Route的处理。routing engine 指出route table里面匹配的route ,并在IRouteHandler实例创建route处理!

4)route handler 创建相关的IHttpHandler实例
在route table里,每一个route 都与一个IHttpHandler对应。IHttpHandler基于当前的HttpContext数据负责创建一个Controller(控制 器)!IHttpHandler是由当前活动的IRouteHandler的GetHttpHandler所创建!

具体的细节如下

public interface IRouteHandler
{
// Methods
IHttpHandler GetHttpHandler(RequestContext requestContext);
}

5)IHttpHandler实例确定 Controller(控制器)
在MVC应用程序中,MvcHandler实现了 IHttpHandler,Controller实例,是基于所输入的HttpContext 和Url参数与route 对应的,ControllerFactory 创建一个controller,ControllerContext包含上下文数据,传入到controller的Excute方法,触发 controller的逻辑处理!

MvcHandler主要有一个ControllerBuilder  _controllerBuilder字段;

具体细节如下

代码

public class MvcHandler : IHttpAsyncHandler, IHttpHandler, IRequiresSessionState
{
// 主要的Fields
private ControllerBuilder _controllerBuilder;
}
ControllerBuilder类主要有一个方法GetControllerFactory
public class ControllerBuilder
{
public IControllerFactory GetControllerFactory();
}

通过实现IControllerFactory 工厂 创建一个Controller

6)Controller执行
所 有的controller 逻辑调用执行时,actions请求被执行!当controller的逻辑被执行时,会返回一个ActionResult。一个ActionResult 实例,会触发呈现一个View(视图),当触发发生时,一个视图引擎被创建,进行进一步的处理

7)一个视图引擎创建
视 图引擎实例会创建一个IView接口实例,返回一个ViewEngineResult实例,

8) 视图呈现
IView 实例编译请求视图,提供Render方法调用的数据!

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏