Controller的激活()
ASPNET MVC的URL路由系统通过注册的路由表对HTTP请求进行解析从而得到一个用于封装路由数据的RouteData对象而这个过程是通过自定义的UrlRoutingModule对HttpApplication的PostResolveRequestCache事件进行注册实现的RouteData中已经包含了目标Controller的名称我们需要根据该名称激活对应的Controller对象接下来进一步分析真正的Controller对象是如何被激活的
MvcRouteHandler
通过前面的介绍我们知道继承自RouteBase的Route类型具有一个类型为IRouteHandler接口的属性RouteHandler它主要的用途就是用于根据指定的请求上下文(通过一个RequestContext对象表示)来获取一个HttpHandler对象当GetRouteData方法被执行后Route的RouteHandler属性值将反映在得到的RouteData的同名属性上在默认的情况下Route的RouteHandler属性是一个MvcRouteHandler对象如下的代码片段反映了这一点
public class Route : RouteBase
{
//其他成员
public IRouteHandler RouteHandler { get; set; }
public Route()
{
//其他操作
thisRouteHandler = new MvcRouteHandler()
}
}
对于我们这个迷你版的ASPNET MVC框架来说MvcRouteHandler是一个具有如下定义的类型在实现的GetHttpHandler方法中它会直接返回一个MvcHandler对象
public class MvcRouteHandler: IRouteHandler
{
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
return new MvcHandler(requestContext)
}
}
MvcHandler
在前面的内容中已经提到整个ASPNET MVC框架是通过自定义的HttpModule和HttpHandler对象ASPNET进行扩展实现的这个自定义HttpModule已经介绍过了就是UrlRoutingModule而这个自定义的HttpHandler则是要重点介绍的MvcHandler
UrlRoutingModule在通过路由表解析HTTP请求得到一个用于封装路由数据的RouteData后会调用其RouteHandler的GetHttpHandler方法得到HttpHandler对象并注册到当前的HTTP上下文由于RouteData的RouteHandler来源于对应Route对象的RouteHandler而后者在默认的情况下是一个MvcRouteHandler对象所以默认情况下用于处理HTTP请求的就是这么一个MvcHandler对象MvcHandler实现了对Controller对象的激活和对相应Action方法的执行
下面的代码片段体现了整个MvcHandler的定义它具有一个类型为RequestContext的属性表示被处理的当前请求上下文该属性在构造函数中指定在实现的ProcessRequest中实现了对Controller对象的激活和执行
public class MvcHandler: IHttpHandler
{
public bool IsReusable
{
get{return false;}
}
public RequestContext RequestContext { get; private set; }
public MvcHandler(RequestContext requestContext)
{
thisRequestContext = requestContext;
}
public void ProcessRequest(HttpContext context)
{
string controllerName = thisRequestContextRouteDataController;
IControllerFactory controllerFactory =
ControllerBuilderCurrentGetControllerFactory()
IController controller = controllerFactoryCreateController(
thisRequestContext controllerName)
controllerExecute(thisRequestContext)
}
}
返回目录ASPNET MVC 框架揭秘
编辑推荐
ASP NET开发培训视频教程
Microsoft NET框架程序设计视频教程
Java程序性能优化让你的Java程序更快更稳定
Visual C++音频/视频技术开发与实战