综述:ASP.NET MVC请求处理管道
ASP.NET MVC的请求处理管道股份许多共同点与传统的ASP.NET Web表单都利用IIS坐标。然而,不像ASP.NET MVC Web窗体,给你更多的灵活性,你可以修改任何一个你自己的喜好,甚至重新调整或更换部件的。最重要的区别是地方的路由(当然你可以在传统的ASP.NET Web表单,MVC路由相似但不是默认)和控制器踢,和过滤器扩展你的能力,更大的规模以及。
本文将指导你通过这个无限扩展的请求处理管道,主要讨论了四个主要的步骤来帮助你抓住大的想法和理解什么是要在幕后场景。
1.iis
互联网信息服务,如微软的Web服务器系统,作为ASP.NET请求处理的骨干。当每个HTTP请求到服务器,一个内核模式设备驱动程序称为HTTP.SYS将首先分类根据其请求的URL请求,端口和IP地址的组合,然后转发给一个已注册的应用程序如IIS网站。
基本上是建立在ASP.NET,ASP.NET MVC的ASP.NET核心,必须保证正常工作的ASP.NET MVC应用程序池启用。当您创建IIS这样一个网站,一个应用程序池的设置应指定适当的ASP.NET工作线程池来照顾的HTTP请求。你可以修改应用程序池如托管管线模式设置多,但这方面是偏离了这篇文章的目的和不会在这里讨论。
当一个请求到达一个ASP.NET启用IIS网站,ASP.NET会从应用程序池工作线程被派遣来对付请求。它向每个注册HTTP模块,一个新的请求开始。HTTP模块。NET类实现IHttpModule接口,你可以连接到ASP.NET请求处理管道。他们通常用于处理特定的事件,如路由信息登录请求的生命周期。
一个特别重要的HTTP模块是由任何ASP.NET MVC应用程序的默认注册:urlroutingmodule。这个模块是核心路由系统,在请求处理管道的第二步骤中起着最重要的角色开始。如果你工作在MVC 2目标。3.5,你会发现这个模块在Web.config文件中注册。在另一方面。4,urlroutingmodule从web.config文件,默认配置机器广泛引用。看到它的安装和运行,你可以在模块在IIS标签您在Internet信息服务(IIS)经理现场一看。
2。核心路由
system.web.routing组件调用时,urlroutingmodule介入处理一个请求。路由的核心工作是关于认识和分析输入的URL,设置请求上下文的数据结构,随后的组件可以使用任何他们希望如ASP.NET MVC使用它来控制传递到相关MVC控制器类和动作方法参数的供应。
核心的ASP.NET MVC路由将首先查看传入请求的URL是对一个静态的文件(如图像文件或磁盘上的样式表文件)。如果是这样,核心路由将通过把它留到IIS。IIS将提供给客户直接使工艺可以有效地完成。
另一方面,如果输入的URL不目标磁盘上的静态文件,例如,它映射到一个MVC控制器,核心路由系统将追究其主动配置如何处理传入的URL。
如何配置路由是在一个静态的集合称为system.web.routing.routetable.routes。此集合中的每个条目代表一个不同的URL模式应用程序希望接受,例如,/商店/目录/ {id},和约束,限制每个参数的可接受的值的范围。此外,每个条目将提供一个路由处理程序对象实现iroutehandler从而接管和工艺的要求。的路由。在ASP.NET MVC应用程序路径集合通常是通过添加代码的方法称为registerroutes()在global.asax文件设置。
以符合特定的传入请求,核心路由系统是通过路由。从上到下收集路线,选择相匹配的URL模式的第一项。找到匹配项,路由传输控制,进入指定的路由处理器,一个请求上下文的数据结构,描述了路由条目和参数的URL解析。MVC框架,然后在行动上。
3。控制器和操作
达到这一步,核心路由系统在路由选择的特定项目。路线,并解析任何路由参数的URL和包装他们请求上下文数据结构里面。现在是控制器和行动进入现场的时间。
在一般情况下,ASP.NET MVC应用程序,几乎所有的路由条目指定一个特定的路由处理程序:mvcroutehandler。它是内置的默认路由处理程序的ASP.NET MVC和它知道如何以请求的上下文数据,调用相应的控制器类。这是通过使用一个控制器工厂对象。默认情况下,该defaultcontrollerfactory使用,但是它可以通过自定义控制器工厂代替案例特别关注
提高例如依赖注入的需求。
当一个相应的控制器,由控制器工厂对象选择,其执行的方法被称为。执行是IController接口,每个控制器类中定义的唯一方法必须实现这样的接口:
publicinterfaceicontroller
{
无效的执行(requestcontextrequestcontext);
}
请注意,RequestContext参数提供的所有请求的上下文数据的路由系统的构建,包括参数的解析,从传入请求URL。它还提供了访问请求和响应对象。
在大多数情况下,你将与高层次的控制器类包和隐藏的执行方法的底层细节IController接口定义。因此,你基本上不会写数据到响应流直接。相反,你返回一个行动的结果,描述预期输出你的控制器。例如,如果你返回一个ViewResult这样的控制器的目标是提供一个视图,或redirecttorouteresult如果你想请求重定向到一个不同的动作方法或一个不同的控制器。MVC框架将负责执行的请求处理管道的结果在适当的时刻。
请注意,过滤器可以被连接到一个控制器类或一个动作方法注入额外的逻辑运行之前或之后的行动方法,或前或后的行动结果的执行。过滤器是非常灵活的,他们的逻辑可以运行在许多可能的时刻,在这一步的请求处理管道。
总之,控制器和动作是整个ASP.NET MVC框架的中心支柱。
4。行动的结果和意见
在这一点上,MVC框架会问你的控制器返回的ActionResult对象执行。ActionResult什么类型的actionresultdoes,要么返回一个字符串的浏览器,产生一个HTTP重定向或最有趣的部分来渲染一个视图。
这是渲染一个视图的工作即是ViewResult ActionResult。这是一个能够定位并提供一个特别的角度,沿着任何可视数据结构作用的方法构建了。它通过调用“视图引擎”(例如,Web窗体视图引擎MVC 2和MVC 3 Razor视图引擎)由控制器确定。
在传统的ASP.NET Web表单,每个Web窗体ASPX页面有一个专用的管道在其自己的,基于飞ASPX / ASCX编译和运行通过一系列的事件称为页面生命周期。ASP.NET MVC讲述一个不同的故事。它的视图页面简单只包含用户界面逻辑。在Web窗体页的文件也没有生命周期没有任何代码,它把你从一个智能的UI设计的湿地更好的架构对关注点分离。
------------------------------------------------------
下面的工作流程图可以帮助你更好地理解ASP.NET MVC请求处理管道。