asp.net

位置:IT落伍者 >> asp.net >> 浏览文章

详解ASP.NET MVC应用程序请求生命周期


发布日期:2020年12月01日
 
详解ASP.NET MVC应用程序请求生命周期

当一个ASPNET MVC应用程序提出请求为了响应请求包含一些请求执行流程步骤! 在ASPNET MVC应用程序Http request

和Http response 过程中主要包含个步骤:

)RouteTable(路由表)的创建

)UrlRoutingModule 请求拦截

)Routing engine 确定route

)route handler 创建相关的IHttpHandler实例

)IHttpHandler实例确定Controller(控制器)

)Controller执行

)一个视图引擎创建

) 视图呈现

主要流程图如下:

)RouteTable的创建

RouteTable的创建发生在mvc应用程序的启动 或者web应用程序池的重启!通常的程序

一个页面请求对应磁盘上的一个页面!如(x

对应到服务器磁盘上的文件indexaspx)indexaspx实际上是一个类由IHttpHandler创建实例化

IHttpHandler包含一个

ProcessRequest方法负责响应页面输出!

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

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

public class MvcApplication :

SystemWebHttpApplication

{

public static void RegisterRoutes(RouteCollection routes)

{

routesIgnoreRoute({resource}axd/{*pathInfo});

routesMapRoute( Default // Route name {controller}/{action}/{id}

// URL with parameters new { controller = Home action = Index id = }

// Parameter defaults );

routesMapRoute( Account // Route name {controller}/{action}/{id}

// URL with parameters new { controller = Account action = LogOn id = }

// Parameter defaults );

}

protected void Application_Start()

{

RegisterRoutes(RouteTableRoutes);

}

}

)UrlRoutingModule 请求拦截

每一个Http 请求 都被UrlRoutingModule拦截UrlRoutingModule提供了当前的HttpContext的

routingengine(路由引擎)

HttpContext实例包含当前请求的所有数据UrlRoutingModule控制着routing engine

提供了HttpContext数据到routing engine! UrlRoutingModule实现了IHttpModule接口在nfig 文件进行

了注册!

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 IHttpModuleInit(HttpApplication application);

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

}

UrlRoutingModule 在WebConfig的注册

<httpModules> <add name=UrlRoutingModule type=SystemWebRoutingUrlRoutingModule

SystemWebRouting Version= Culture=neutralPublicKeyToken=BFADE/>

</httpModules>

)Routing engine 确定route

routing engine基于当前HttpContext确定Route的处理routing engine 指出route table里面匹配的route

在IRouteHandler实例创建route处理!

)route handler 创建相关的IHttpHandler实例在route table里每一个route 都与一个IHttpHandler对应

IHttpHandler基于当前的HttpContext数据负责创建一个Controller(控制器)!IHttpHandler是由当前活动的

IRouteHandler的GetHttpHandler所创建!

具体的细节如下

public interface IRouteHandler

{

// Methods IHttpHandler GetHttpHandler(RequestContext requestContext);

}

)IHttpHandler实例确定Controller(控制器)

在MVC应用程序中MvcHandler实现了IHttpHandlerController实例是基于所输入的HttpContext

和Url参数 与route 对应的

ControllerFactory 创建一个controllerControllerContext包含上下文数据传入到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

)Controller执行

所有的controller 逻辑调用执行时actions请求被执行!当controller的逻辑被执行时会返回一个

ActionResult

一个ActionResult实例会触发呈现一个View(视图)当触发发生时一个视图引擎被创建进行进一

步的处理

)一个视图引擎创建

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

) 视图呈现

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

上一篇:ASP.NET中文件上传下载方法集合

下一篇:ASP.NET验证码技术