通过问题学习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>

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

原文地址:https://www.cnblogs.com/ASPNET2008/p/2203879.html