zoukankan      html  css  js  c++  java
  • 通过问题学习asp.net mvc局部处理流程

        本人平时比较喜欢和他人讨论一些技术上的问题,并不是我技术有多么好,而是我喜欢在这种讨论中从中获取新知识,同时也可以将自己的心得与他人分享,最近一朋友的问题如下:
       
        问题:asp.net mvc是如何处理请求的,即当用户在浏览器中输入URL后,是怎么一步一步处理,最终找到对应的Controller,然后执行相对的Action?
       
        用了mvc有小两年了,但目前也只陷于会使用它,对它里面的好多原理我并没有深入的进行研究,尽管我知道一些请求处理流程,但在针对MVC时,有些细节一时没想起来。http请求从头来讲有点多,这篇呢我只想从http请求进入了appDomain开始,其它部分以后再总结。下面是我当时的回答:
       
        第一:有一个HttpApplication的东东。
              注:至于它是做什么的,我当时也没多说,也没印象了。
              缺点:直接就从它开始,显然是错误的:
              1:在这之前应该有一个非常重要的类:HttpRuntime,没有它怎么生成HtppContext?
              2:在HttpApplication之前,还有一个工厂类,HttpApplicationFactory。
        
        第二:过了HttpApplication后就是一堆的HttpModule。
       
              缺点:显然没有结合MVC,应该说一个和MVC相关的Module才行吧。
             
        第三:最后就是真命天子HttpHandler,由它负责处理后续过程。
       
              缺点:
              1:和上面一样,没有提到任何和MVC相关的东西,起码对于重要的处理路由的MvcRouteHandler没有说,说大概念MvcHttpHandler也行呀;
              2:之前我以为Controller继承了IHttpHandle,就像asp.net webform中的Page继承了IHttpHandler一样,后来仔细找了找,发现没有,两者在处理流程上是有区别的。
             
        上面的回答显然不专业,从回答中看不出MVC的路由原理,为此我画了如下一张图,稍微清楚些:
       

                                  
       

        通过这张图我们可以更加详细的了解到它们各自的作用:
        1:HttpRuntime:这有一个重要方法ProcessRequest,这个方法里面有一个参数HttpWorkerRequest,里面包含了所有http信息,至于HttpWorkerRequest是怎么来的,以后找时间总结下。最后它将请求交给HttpApplication;
        2:HttpApplicationFactory:这个没什么好说的,它的作用就是创建一个HttpApplication;
        3:HttpApplication:它代表我们的web应用程序,程序中的Global就继承于它;
        4:HttpModule:它可以决定请求最终由哪个具体的IHttpHandler来处理,同时可以在进入IHttpHandler之前可以对HttpContext做些处理,比如增加一些附加信息等等;
        5:HttpHandler:它是最终负责处理请求的类,比如MVC中的MvcRouteHandler
       
        其实上面的这些局部知识,比如我们从哪知道UrlRoutingModule,MvcRouteHandler等?答案都可以从我们创建的asp.net mvc项目中找到。
       
        我们看看生成的Web.Config文件,再查下资料就能找到答案了,从配置文件中可以清楚看出MVC路由依赖什么,知道了这些,当你看到MVC项目生成config后,再比较asp.net webform的配置文件,就会明白为什么有那些差异了。
         

    <httpHandlers>    
          <add verb="*" path="*.mvc" validate="false" type="System.Web.Mvc.MvcHttpHandler, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        </httpHandlers>
        <httpModules>   
          <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        </httpModules>

        
        
        总结:这篇文章就是为了在知道怎么做的情况了,也能知道为什么能这么做。
       
        注:如文中有误解之处,希望批评指正。
       
       

  • 相关阅读:
    【转】使用SpringMVC创建Web工程并使用SpringSecurity进行权限控制的详细配置方法
    配置Linux系统ssh免密登录
    numpy的随机数组
    numpy.where和numpy.piecewise的用法
    numpy、pandas学习笔记
    数据库行存储和列存储的区别
    pandas对DataFrame对象的基本操作
    pandas中assign方法的使用
    numpy实现快速傅里叶变换
    最小二乘法在线性拟合中的使用
  • 原文地址:https://www.cnblogs.com/ASPNET2008/p/2203879.html
Copyright © 2011-2022 走看看