ASP.NET MVC是如何运行的[1]: 建立在“伪”MVC框架上的Web应用

简介:

ASP.NET由于采用了管道式设计,具有很好的扩展性,而整个ASP.NET MVC应用框架就是通过扩展ASP.NET实现的。通过上面对ASP.NET管道设计的介绍,我们知道ASP.NET的扩展点只要体现在HttpMoudle和HttpHandler这两个核心组建之上,实际上整个ASP.NET MVC框架就是通过自定义的HttpMoudle(UrlRoutingModule)和HttpHandler(MvcHandler)实现的。为了上读者从整体上把握ASP.NET MVC的工作机制,接下来我按照其原理通过一些自定义组件来模拟ASP.NET MVC的运行原理,我们也可以将此视为一个“迷你版”的ASP.NET MVC。值得一提的是,为了让读者根据该实例从真正的ASP.NET MVC中找到对应的组件,我完全采用了与ASP.NET MVC一致的类型命名方式。[源代码从这里下载]

在正式介绍我们自己创建 的“迷你版”ASP.NET MVC的实现原理之前,我们不妨来看看建立在该框架之上的Web应用如何实现。我们通过Visual Studio创建一个空的ASP.NET Web应用(注意不是ASP.NET MVC应用),我们不会引用System.Web.Mvc.dll这个程序集,所以你在接下来的程序中看到的定义在该程序集中的同名类型都是我们自行定义的。

我们首先定义了如下一个SimpleModel类型,它表示最终需要绑定到View上的数据。简单起见,同时也为了验证针对Controller和Action的解析机制,SimpleModel定义的两个属性分别表示当前请求的目标Controller和Action。

   1: public class SimpleModel
   2: {
   3:     public string Controller { get; set; }
   4:     public string Action { get; set; }
   5: }

像真正的ASP .NET MVC应用开发一样,我们需要定义Controller类型。如下面的代码片断所示,按照我们熟悉的命名方式(以字符Controller作为后缀),我们定义了如下一个HomeController。HomeController实现的抽象类型ControllerBase是我们自行定义的。以自定义的ActionResult作为返回类型的Index方法表示Controller的Action,它接受一个SimpleModel类型的对象作为参数。该Action方法返回的ActionResult是一个RawContentResult对象,顾名思义,RawContentResult就是将指定的内容进行原样显示。在这里我们将作为参数的SimpleModel对象的Controller和Action属性显示出来。

   1: public class HomeController: ControllerBase
   2: {
   3:     public ActionResult Index(SimpleModel model)
   4:     {
   5:         string content = string.Format("Controller: {0}<br/>Action:{1}", model.Controller, model.Action);
   6:         return new RawContentResult(content);
   7:     }
   8: }

ASP.NET MVC根据请求地址来解析出用于处理该请求的Controller的类型和Action方法名称。具体来说,我们预注册一些包含Controller和Action名称作为站位符的(相对)地址模板,如果请求地址符合相应地址模板的模式,Controller和Action名称就可以正确地解析出来。和ASP.NET MVC应用类似,我们在Global.asax中注册了如下一个地址模板({controller}/{action})。

   1: public class Global : System.Web.HttpApplication
   2: {
   3:     protected void Application_Start(object sender, EventArgs e)
   4:     {            
   5:         RouteTable.Routes.Add("default",new Route{Url = "{controller}/{action}"});
   6:         ControllerBuilder.Current.SetControllerFactory(new DefaultControllerFactory());
   7:         ControllerBuilder.Current.DefaultNamespaces.Add("WebApp");
   8:     }
   9: }

在如上所示的用于进行地址模板注册的Application_Start方法之中,我们还注册了一个用于创建Controller对象的工厂。前面定义的HomeController定义在命名空间WebApp下,由于请求地址中只能解析出Controller类型的名称,我们需要将该命名空间注册为当前ControllerBuilder的默认命名空间。RouteTable、ControllerBuilder和DefaultControllerFactory都是我们自定义的类型。

正如我上面所说,ASP.NET MVC是通过一个自定义的HttpModule实现的,在这个“迷你版”ASP.NET MVC框架中我们也将其起名为UrlRoutingModule。在运行Web应用之前,我们需要通过配置对该自定义HttpModule进行注册,下面是相关的配置。

   1: <configuration>
   2:   <system.webServer>
   3:      <modules>
   4:           <add name="UrlRoutingModule" 
   5:                type="Artech.MiniMvc.UrlRoutingModule, Artech.MiniMvc"/>      
   6:     </modules>    
   7:   </system.webServer>
   8: </configuration>

到目前为止,所有的编程和配置工作已经完成。为了 让定义在HomeController中的Action方法Index来处理针对该Web应用的访问请求,我们需要指定与之匹配的地址(符合定义在注册地址模板的URL模式)。如下图所示,由于在浏览器中输入地址(http://.../Home/Index)正好对应着HomeController的Index操作,所以对应的方法会被执行,而执行的结果就是将当前请求的目标Contrller和Action的名称显示出来。

image

上面我们我们演示了如何在我们自己创建的“迷你版”ASP.NET MVC框架中创建一个Web应用,从中我们可以看到和创建一个真正的ASP.NET MVC应用别无二致。接下来我们就来逐步地分析这个自定义的ASP.NET MVC框架是如何建立起来的,而它也代表了真正的ASP.NET MVC框架的工作原理。

ASP.NET MVC是如何运行的[1]: 建立在“伪”MVC框架上的Web应用
ASP.NET MVC是如何运行的[2]: URL路由
ASP.NET MVC是如何运行的[3]: Controller的激活
ASP.NET MVC是如何运行的[4]: Action的执行


作者:蒋金楠
微信公众账号:大内老A
微博: www.weibo.com/artech
如果你想及时得到个人撰写文章以及著作的消息推送,或者想看看个人推荐的技术资料,可以扫描左边二维码(或者长按识别二维码)关注个人公众号(原来公众帐号 蒋金楠的自媒体将会停用)。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
相关文章
|
8月前
|
开发框架 前端开发 Go
【GoGin】(0)基于Go的WEB开发框架,GO Gin是什么?怎么启动?本文给你答案
Gin:Go语言编写的Web框架,以更好的性能实现类似Martini框架的APInet/http、Beego:开源的高性能Go语言Web框架、Iris:最快的Go语言Web框架,完备的MVC支持。
674 1
|
开发框架 JSON 中间件
Go语言Web开发框架实践:路由、中间件、参数校验
Gin框架以其极简风格、强大路由管理、灵活中间件机制及参数绑定校验系统著称。本文详解其核心功能:1) 路由管理,支持分组与路径参数;2) 中间件机制,实现全局与局部控制;3) 参数绑定,涵盖多种来源;4) 结构体绑定与字段校验,确保数据合法性;5) 自定义校验器扩展功能;6) 统一错误处理提升用户体验。Gin以清晰模块化、流程可控及自动化校验等优势,成为开发者的优选工具。
|
开发框架 安全 前端开发
Go Web开发框架实践:模板渲染与静态资源服务
Gin 是一个功能强大的 Go Web 框架,不仅适用于构建 API 服务,还支持 HTML 模板渲染和静态资源托管。它可以帮助开发者快速搭建中小型网站,并提供灵活的模板语法、自定义函数、静态文件映射等功能,同时兼容 Go 的 html/template 引擎,具备高效且安全的页面渲染能力。
|
人工智能 自然语言处理 JavaScript
测试工程师要失业?Magnitude:开源AI Agent驱动的端到端测试框架,让Web测试更智能,自动完善测试用例!
Magnitude是一个基于视觉AI代理的开源端到端测试框架,通过自然语言构建测试用例,结合推理代理和视觉代理实现智能化的Web应用测试,支持本地运行和CI/CD集成。
2486 15
测试工程师要失业?Magnitude:开源AI Agent驱动的端到端测试框架,让Web测试更智能,自动完善测试用例!
|
开发框架 JSON 中间件
Go语言Web开发框架实践:使用 Gin 快速构建 Web 服务
Gin 是一个高效、轻量级的 Go 语言 Web 框架,支持中间件机制,非常适合开发 RESTful API。本文从安装到进阶技巧全面解析 Gin 的使用:快速入门示例(Hello Gin)、定义 RESTful 用户服务(增删改查接口实现),以及推荐实践如参数校验、中间件和路由分组等。通过对比标准库 `net/http`,Gin 提供更简洁灵活的开发体验。此外,还推荐了 GORM、Viper、Zap 等配合使用的工具库,助力高效开发。
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
916 0
|
存储 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(五)
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面,商品详情等功能的开发,今天继续讲解购物车功能开发,仅供学习分享使用,如有不足之处,还请指正。
524 0
|
开发框架 前端开发 .NET
[回馈]ASP.NET Core MVC开发实战之商城系统(三)
[回馈]ASP.NET Core MVC开发实战之商城系统(三)
379 0
|
开发框架 前端开发 .NET
[回馈]ASP.NET Core MVC开发实战之商城系统(一)
[回馈]ASP.NET Core MVC开发实战之商城系统(一)
629 0
|
SQL 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(开篇)
[回馈]ASP.NET Core MVC开发实战之商城系统(开篇)
585 0