请求处理管道
请求管道是一些用于处理http请求的模块组合,在asp.net中,请求管道有两个核心组件:
ihttpmodule和
ihttphandler。所有的http请求都会进入
ihttphandler,有
ihttphandler进行最终的处理,而
ihttpmodule通过订阅
httpapplication对象中的事件,可以在
ihttphandler对http请求进行处理之前对请求进行预处理或
ihttphandler对http请求处理之后进行再次处理。
在IIS7之前,如IIS6或IIS5,请求处理管道分为两个:IIS请求处理管道和ASP.NET管道,若客户端请求静态资源则只有IIS管道进行处理,而ASP.NET管道不会处理该请求。从IIS7开始两个管道合二为一,称为集成管道。

上图中主要描述ASP.NET运行时对HTTP请求的处理且不涉及太多细节。
HttpApplication与HttpModule
HTTP请求由ASP.NET运行时接管之后,
HttpRun<a href="http://www.php.cn/wiki/1268.html" target="_blank">time</a>会利用
HttpApplicationFactory创建或从
HttpApplication对象池(.NET中类似的机制有线程池和字符串拘留池)中取出一个
HttpApplication对象,同时ASP.NET会根据配置文件来初始化注册的
HttpModule,
HttpModule在初始化时会订阅HttpApplication中的事件来实现对HTTP请求的处理。
在ASP.NET MVC5中,
Global.asax文件中定义了
MvcApplication类,继承自
HttpApplication类:
public class MvcApplication : System.Web.HttpApplication
{ protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteTable.Routes.Add("xfhHandler", new Route( "{controller}/{action}", new RouteValueDictionary(new Dictionary<string, object>() { ["controller"] = "home", ["action"] = "index" }), new XfhUrlRouteHandler())
); //RouteConfig.RegisterRoutes(RouteTable.Routes); }
}Application_Start()方法最先执行,一般在该方法中添加一些配置,如路由注册、全局过滤器的注册等。
Route
一个HTTP请求会经过至少一个
HttpModule的处理。
UrlRoutingModule是非常重要的模块,它是路由系统的核心。路由系统的职责是从请求URL中获取controller和action的名称以及其它请求数据。
UrlRoutingModule根据当前请求的URL和
RouteTable中已注册的路由模板进行匹配并返回第一个和当前请求相匹配的路有对象
Route,然后根据路有对象获取路由数据对象
RouteData(ASP.NET MVC中,路由数据必须包含controller和action的名称),再有
RouteData获取
IRouteHandler最终有
IRouteHandler得到
IHttpHandler。
HttpHandler
一个HTTP请求最终要进入HttpHanler中进行处理,一次HTTP请求只能被一个HttpHandler进行处理。
Controller
IHttpHandler在
ProcessRequest方法中对当前请求进行处理,在该方法中通过
ControllerBuilder得到
IControllerFactory然后通过反射的方式获取
Controller的类型。
Action
ASP.NET MVC中
ControllerBase是所有
Controller的基类,在类型的
Execute方法中通过
IActionInvoker的
InvokeAction方法来执行对
Action的调用。在
Action执行前会进行模型绑定和模型认证操作。
Filters
在ASP.NET MVC5中有常用的过滤器有5个:
IAuthenticationFilter、
IAuthorizationFilter、
IActionFilter、
IResultFilter、
I<a href="http://www.php.cn/wiki/265.html" target="_blank">Exception</a>Filter。
在ASP.NET MVC中所有的过滤器最终都会被封装为
Filter对象,该对象中
FilterScope类型的属性
Scope和
int类型属性
<a href="http://www.php.cn/wiki/1360.html" target="_blank">Ord</a>er用于决定过滤器执行的先后顺序,具体规则如下:
Order和
FilterScope的数值越小,过滤器的执行优先级越高;
Order比
FilterScope具有更高的优先级,在
Order属性值相同时才会被考虑
//数值越小,执行优先级越高public enum FilterScope
{
Action= 30,
Controller= 20,
First= 0,
Global= 10,
Last= 100}ActionResult
Action执行完毕之后会返回
ActionResult类型对象作为对此次请求进行处理的结果,对于不是
ActionResult类型的返回值,ASP.NET MVC会将其转换为
ActionResult类型。
请求生命周期
ASP.NET 应用程序的生命周期以浏览器向 Web 服务器发送请求为起点,请求到达服务器后进入处理管道,至浏览器接收服务器响应时为止。
最后附上一张老外绘制的ASP.NET请求管道图,图片来自《ASP.NET MVC Interview Questions and Answers Book》这本书。

课程推荐
php中文网在线Java视频教程
