转自:http://www.cnblogs.com/liuhf939/p/3417203.html

比较WebForm和Mvc的请求处理方式

首先简单了解一下Asp.Net中怎么对页面进行请求处理的:

  在管道的第7-8个事件之间,有一个MapHttpHandler类型,在这个类型的Execute方法中中会通过url去创建一个用于后续处理请求的HttpHandler对象。

    判断HttpContext有没有去指向一个具体的HttpHandler处理程序,如果已经指向了一个HttpHandler,那么就返回这个HttpHandler;(Mvc指向一个具体的Handler)

    否则根据url请求去反射创建一个一般处理程序或者Page页面;(一般处理程序或Page页面)

  在管道第11-12个事件之间,有一个CallHandlerExecutionStep类型,它的Execute方法会拿到上面返回的HttpHandler对象,执行HttpHandler的ProcessRequest方法。

    

WebForm会根据url指定的处理程序名称去反射创建一个HttpHandler,如:http://www.ermao.com/webform.aspx;

应用程序可以找到WebForm.aspx文件,通过反射去创建这个处理程序,执行其ProcessRequest方法;

Asp.Net MVC的请求处理:

  试想一下,Mvc可以这样么?Mvc的url并没有指向一个具体的页面,没有文件后缀名,而且url是不区分大小写的。那么它怎么创建Controller的呢?  

  在MVC中,在Global中注册了一个全局的路由表,当应用程序第一次被请求的时候,Mvc会反射到所有实现了IController接口、且以Controller结尾的类的类型,放在一个名为controllerTypes的类型集合中。

  在系统默认的Config文件中,在第7个事件中注册了一个UrlRoutingModule,请求到来时,UrlRoutingModule会根据url请求和路由表,匹配一条路由数据(RouteData),然后根据路由数据(RouteData)和上下文对象(HttpContext)最终获得一个HttpHandler方法,这个HttpHandler具体类型就是MvcHandler,然后调用了HttpContext的RemapHandler方法,指向了一个MvcHandler。

  上面提到,MapHttpHandler中,判断是否指向一个具体的HttpHandler,Mvc就是注册了第7个事件,最终获取并指向了MvcHandler,这样Mvc就继续在管道中流动了。

  接下来就是CallHandlerExecutionStep中怎么去处理MvcHandler了,在MvcHandler的ProcessRequest中,它会获取到一个默认的ControllerFactory,根据RouteData中的Controller名、Action名,然后和上面说道的controllerTypes名进行忽略大小写的比较,匹配到一个controllerTypes中的一个Controller类型,进一步通过反射回去到Action名的方法,一同执行Action方法和过滤器,最后返回一个视图结果(WebForm试图或Razor或其他视图),渲染视图。

  WebForm的请求方式可以看出,Url地址并不友好,动态后缀也会影响到SEO,为了SEO优化我们不得不去做一些Url重写或者注册路由。

  在Asp.Net MVC中,Url地址是直接使用的路由机制,这样友好的Url,无论实在用户还是开发人员还是蜘蛛爬虫,都是很友好的。

强类型视图和ViewState

  WebForm是用了CodeBehand来进行前后台传值:

    因为前台页面继承于后台页面,所以后台页面公开的属性,前台页面可以通过<%...%>的方式去访问;

      因为前台页面所有加了runat=Server的控件,都会以变量的方式存在于后台类中,所以后台页面可以调用前台页面的控件属性;

  那么Mvc中控制器和视图是分开的,ViewData是怎么在通过Controller在Model和View之间相互传值的呢? 

    看一下这个类,我们把这个类当作一个中间类。Controller和View之间传输数据的类,

    这个类里有索引器,存储Object类型也就是我们常用的ViewData["User"]=...

    还有一个是Model属性,也就是我们在Controller中用到的ViewData.Model=...

 1     public class ViewDataDictionary : IDictionary<string, object>
2 {
3 private readonly Dictionary<string, object> _innerDictionary = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
4 private object _model;
5
6
7 public object this[string key]
8 {
9 get
10 {
11 object value;
12 _innerDictionary.TryGetValue(key, out value);
13 return value;
14 }
15 set { _innerDictionary[key] = value; }
16 }
17
18 public object Model
19 {
20 get { return _model; }
21 set
22 {
23 _modelMetadata = null;
24 SetModel(value);
25 }
26 }
27 }

    再看这个,ControllerBase类中的ViewData属性和ViewBag属性

    可以看到ViewBag调用的还是ViewData,所以他们两个数据存储对象是同一个,ViewBag用了动态属性

    Action执行完成后会把ControllerContext传递给视图,视图就可以拿到ControllerBase中的ViewBag、ViewData属性了

         public dynamic ViewBag
{
get
{
if (_dynamicViewDataDictionary == null)
{
_dynamicViewDataDictionary = new DynamicViewDataDictionary(() => ViewData);
}
return _dynamicViewDataDictionary;
}
} public ViewDataDictionary ViewData
{
get
{
if (_viewDataDictionary == null)
{
_viewDataDictionary = new ViewDataDictionary();
}
return _viewDataDictionary;
}
set { _viewDataDictionary = value; }
}

虽说MVC没有了ViewState,但是带来了另外一个好处——强类型视图。

  这里接简单的说一下,强类型视图的源码,还没有完全读懂。希望读懂以后继续和大家探讨

  从一开始接触WebForm,就很不喜欢用ViewState,需要的时候用隐藏域或者后台类给页面一个公开的属性,写C#代码来实现数据回传,一些不需要经常改变的就直接缓存。因为没有太多用过ViewState,所以我说的对不对也不一定,但是肯定的说ViewState带来的其他负担是不可避免的,至少在客户端和服务器之间来回传递数据的时候,可以节省很多带宽,如果是内网系统,那么带宽也无所谓了。

  在Asp.Net MVC中,Model的绑定机制也可以实现类似于ViewState的功能,而且它比ViewState更加灵活、更强大、更加友好,也不需要在客户端和服务器端来回传递,也可以做到“快速开发”。

WebForm还是Asp.Net MVC

    WebForm:

        优点:    1.提供了大量的服务器端控件,可以实现快速开发。

              2.ViewState回传数据很方便。

              3.学习成本低。

        缺点:  1. 封装太强,虽然学习成本低,很多底层东西让初学者不是很明白。

              2. 自定义控制不灵活,不利于美工和开发人员的配合,往往那些服务器控件处理稍有不慎就会导致出错。

              3. ViewState在页面中的传递。

   Asp.Net MVC:

        优点:   1.很容易将复杂的应用分成Model(ViewModel)、View、Controller三个组件模型,将处理后台逻辑代码与前台展示逻辑进行了很好的分离,属于松耦合关系。  

               2.很多组件可以有自己来自定义,扩展性很强,会让很多复杂的问题处理起来更为简便。

                  {

                  如:ControllerFactory、DependencyResolver可以让自己定义,通过Ioc去注入属性,得到解耦的目的。

                  ActionFilter,方便在请求到来各个阶段进行拦截加工处理。

                  定义自己的HtmlHelper方法,定义自己的Html控件模型...

                }

               3.因为没有服务器端控件,所以程序员控制的会更加灵活,页面更加干净,没有viewstate。

               4.通过修改路由规则,可以控制生成自定义的url,因此控制生成seo友好的url将更加容易。

               5.强类型view实现、Razor视图、Model绑定机制、Model的验证机制,还有天生的异步编程,更安全高效。

        缺点: 学习成本高,结构复杂,对未变化数据的不必要的频繁访问,也将损害操作性能,对于中小型网站开发,分层显得很繁琐,没有必要。

  不过我不认为MVC能取代WebForm,因为我们可以避开它的缺点,不使用服务器控件,很好的利用CodeBehind,利用它的一些优势也可以去开发高性能的互联网网站,相对MVC来说要简单很多。

                                                          

                                                自己的一些见解,还望多多指教!

                                                感谢您的光临!

WebForm和MVC的一些知识(转)的更多相关文章

  1. [转]asp.net webform 与mvc 共享session

    公司内部系统最早是用.net webform模式开发的,现新项目用.net mvc 开发,现存在的问题就是如何保持原有.net webform的登录状态不变,而在mvc中能够验证用户的登录状态,也就是 ...

  2. 解析ASP.NET WebForm和Mvc开发的区别

    因为以前主要是做WebFrom开发,对MVC开发并没有太深入的了解.自从来到创新工场的新团队后,用的技术都是自己以前没有接触过的,比如:MVC 和EF还有就是WCF,压力一直很大.在很多问题都是不清楚 ...

  3. asp.net webform 与mvc 共享session

    公司内部系统最早是用.net webform模式开发的,现新项目用.net mvc 开发,现存在的问题就是如何保持原有.net webform的登录状态不变,而在mvc中能够验证用户的登录状态,也就是 ...

  4. webform 转 MVC 飞一般的感觉

    前言: 浅谈webform与mvc,让开发变得更加简单,这里主要通过比较webform与mvc的开发方式,以下全属个人看法,不完善的地方可以留言补充. 正文: 废话不多说,直接说工作中经常用到的地方 ...

  5. 解析ASP.NET WebForm和Mvc开发的区别 分类: ASP.NET 2013-12-29 01:59 11738人阅读 评论(5) 收藏

    因为以前主要是做WebFrom开发,对MVC开发并没有太深入的了解.自从来到创新工场的新团队后,用的技术都是自己以前没有接触过的,比如:MVC 和EF还有就是WCF,压力一直很大.在很多问题都是不清楚 ...

  6. WebForm、MVC图片加载失败处理

    还是那个该死的WebFrom项目,部分功能替换为MVC后感觉好多了,但是WebForm.MVC都有图片加载失败时显示提示图片的需求,并且统一在js中处理.问题来了,js中图片路径怎么处理呢?现场有可能 ...

  7. Log4Net 在ASP.NET WebForm 和 MVC的全局配置

    使用log4net可以很方便地为应用添加日志功能.应用Log4net,开发者可以很精确地控制日志信息的输出,减少了多余信息,提高了日志记录性能.同时,通过外部配置文件,用户可以不用重新编译程序就能改变 ...

  8. MVC架构、WebForm与MVC对比

    ylbtech-ASP.NET MVC:WebForm与MVC对比 功能描述:WebForm与MVC对比 A.1,MVC架构 •MVC(Model-View-Controller)用于表示一种软件架构 ...

  9. 自己写的一个Pager分页组件,WebForm,Mvc都适用

    我一说写这个功能的时候,好多人估计有疑问.分页功能网上多的是,搜一个不就行了,你这样不是浪费时间么.你说这句话的时候,我是比较信的,首先自己写一些东西是很耗时,有这些时间又能多打几盘LOL了.但是我觉 ...

随机推荐

  1. Solutions for the Maximum Subsequence Sum Problem

    The maximum subarray problem is the task of finding the contiguous subarray within a one-dimensional ...

  2. 在windows下部署Redis 当作系统服务器自动启动

    部署Redis 其实Redis是可以安装成windows服务的,开机自启动,命令如下: redis-server --service-install redis.windows.conf 安装完之后, ...

  3. JAVA class 编译jar。 控制台使用jar

    //编译jar jar -cvf  -mgtvEncode.jar -mgtvEncode.class //使用jar java -cp mgtvEncode.jar mgtvEncode

  4. 基于Unity3d 引擎的Android游戏优化

    原文地址:http://blog.csdn.net/jixuguo/article/details/9018669 近期项目进入收尾阶段,之前对项目做了非常多优化,mesh合并 .降低DrawCall ...

  5. vim:去掉响铃

    vim在移动字符出界(上下左右)包括按<ESC>建都会响铃,有时候真的很烦. 在网上搜了一下,原来是visualbell来控制的,在vim里使用命令:help visualbell,原来禁 ...

  6. wpf程序线程与UI内容交互

    在UI线程里执行复杂的操作,会造成UI假死.常用的解决方法是开2个线程. 而新线程要调用UI里的东西,必须这么用: this.Dispatcher.Invoke(content);

  7. Go源代码分析——http.ListenAndServe()是怎样工作的

    Go对webserver的编写提供了很好的支持,标准库中提供了net/http包来方便编写server.很多教程和书籍在讲到用Go编写webserver时都会直接教新手用http包写一个最简单的hel ...

  8. cpu降频问题

    cpu做为能耗很高的硬件,最近几年厂商在节能方面做了很多处理,在服务器运行时,基于负载情况可调节成节能模式,节省电能,副作用是cpu的频率会降低,导致应用程序性能降低. 有第三方统计,服务器规模达到万 ...

  9. 我为什么鼓励程序员写blog

    工程师该怎样才能突破自己的能力瓶颈?写 blog! 工程师该怎样精进自己在职涯上所需要的能力?写 blog! 工程师该怎样才能保持学习与成长的动能?写 blog! 工程师该怎样才能证明自己的潜力与特质 ...

  10. Python 里 and、or 的计算规则

    引子: >>> print '' or 5 or 05>>> print 5 and 44>>> print '' or 5 or 0 and 4 ...