利用Asp.net实现简单的MVC
认识Asp.net MVC
Asp.net是微软提供的用于网站开发的基础框架。Asp.net MVC是在Asp.net的基础上实现的MVC模式,Asp.net Webform 是在asp.net的基础上实现了事件请求机制。Asp.net WebForm与Asp.net MVC是asp.net基础上的两种不同的编程框架。
Asp.net WebForm处理流程
客户端浏览器向服务其发出请求--->IIS服务其接受请求--->IIS交由asp.net处理,asp.net请求管道机制(过滤请求,根据请求选择不同处理程序)---->处理程序IHandler
根据HttpContext.HttpRequest
读取用户请求信息,HttpContext.HttpResponse
写入服务器响应流(如下图)
其实就是各流处理,客户端根据Http协议发出请求流--->服务端根据请求流发送到客户端响应流
Asp.net WebForm实现MVC
实现思想:通过实现IHttpModule
注入asp.net请求管道,并调用将请求交由实现的IHttpHandler
类,在IHttpHandler
处理用户请求。具体实现过程
- 实现
IHttpModule
并通过config注入管道(IIS的Integrated
和Classic
模式写法不同) - 通过
Route
得到RouteData
,RouteData
指明了IHandler
IHandler
的执行需要调用用户请求Controller
下的Action
Controller
相关类通过IControllerFactory
得到Controller
ActionInvoker
执行Controller
下的Action
IModelBinder
根据用户请求中的数据绑定到Action
的参数ActionResult
根据Action
返回值,写入HttpContext.HttpResponse
响应流
具体实现分析
Route实现
Route
最终需要得到的值为RouteData
,RouteData
包括IHandler
和从请求中提取的Controller
和Action
值。为了使用的灵活性,满足可以根据用户定义URL模板。
Route
主要根据URL模块提取用户请求,指明IHandler
RouteTable
包括Route
的集合对象,作用可以声明多个Route
- 服务开启时注入
Route
Controller实现
IRouteHandler
通过Controller
和Action
的值得到实体
IRouteHandler
获得IHandler
IControllerFactory
通过工厂获得IController
ControllerBuilder
在服务启动时注入IControllerFactory
DefaultControllerFactory
通过反射或取Web端下的Controller
Action调用
现在已经得到了Controller
。下面解决调用Controller
下的Action
.
IActionInvoker
反射调用Action
,需要参数绑定IModelBinder
根据请求数据绑定参数ActionResult
根据Action
执行的返回值写入响应流