zoukankan      html  css  js  c++  java
  • MVC运行机制

    一,第一次程序运行时

    1,第一次请求的时候 会获取配置文件,同时加载global.asax文件。执行global.asax的Application_Start()方法,调用 RouteConfig.RegisterRoutes(RouteTable.Routes); 来注册路由规则,RouteConfig.RegisterRoutes()方法里,给出的默认规则为{controller}/{action}/{id} .
    2,在Global.asax文件中,网站第一次运行会创建RouteTable对象,通过查询路由表来生成url,路由表总是按顺序被依次遍历,直到匹配,实现URL到处理程序的映射.
    3,UrlRountngModel模块解析URL,创建相关的处理程序
    4,执行MvcHandler,创建执行的Controller并传递给控制器上下文ControllerContext
    5,执行Controller,调用指定方法
    6,执行View()方法,执行指定方法中的View(),将视图返回给浏览器

    二,当请求MVC页面时,web.config配置文件中的UrlRoutingModule模块解析该URL,并获取相关的RouteData对象来创建HttpHandler的实例 
    MvcHandler,然后在调用MvcHandler的ProcessRequest()方法创建控制器的实例,再执行控制器的Execute()方法并通过反射机制指定要 
    调用的View()方法来实现页面内容向浏览器推送。

    三,Global.asax理解:

    Global.asax实现MVC的URL的路由控制,可以在其中的RegisterRoutes()中设置默认的路由.
    Global.asax是一个全局事件,则在页面第二次请求是不会进去,路由配置解析等到都直接生成程序。
    Global.asax中的Application_Start:在程序初始化的时候执行。在Web应用程序的生命周期里就执行一次,这里只能放一些公用的信息

    global.asax这个文件包含全局应用程序事件的事件处理程序。它响应应用程序级别和会话级别事件的代码。  
    运行时, Global.asax 将被编译成一个动态生成的 .NET Framework 类,该类是从HttpApplication基类派生的。 
    因此在global.asax中的代码可以访问HttpApplication类中所有的public或者protected的成员
    global.asax不被用户直接请求,但global.asax中的代码会被自动执行来响应特定的应用程序事件。
    global.asax是可选的,而且在一个web项目中是唯一的,它应该处于网站的根目录。

    四,那Global.asax和配置文件的加载存在先后顺序么? 

    Global.asax文件的执行 :

    1》IIS现在接到一个访问ASP.NET应用程序的请求,这时候IIS会将这个请求映射给aspnet_isapi.dll,当aspnet_isapi.dll接到这个请求后,会新建一个aspnet_wp.exe的进程(windows server 2003下是w3wp.exe进程)

    2》这个进程会将请求传递给一个被指定的AppDomain,当这个AppDomain被创建时,就会去加载一些配置文件中的信息(加载顺序是从machine.config文件到web.config文件中的一些相关配置),而当这些信息都被加载以后,AppDomain会去获得一个HttpApplication的实例,这个时候global类就会被编译加载了

    3》接下来AppDomain会做一些相关的处理创建Page类的实例,最后这个页面呈现到客户端浏览器上。

    4》但这里有一点问题需要注意,当配置文件被加载的时候,并不是表示AppDomain会加载配置文件中所有的信息,而仅是加载一些需要的信息。而有些配置信息是在需要时,才会被AppDomain加载。

    5》例如我们在web.config文件中配置了很多HttpModule,但是仅当每一个HttpModule被访问到时,AppDomain才会去加载并处理这些信息。所以说web.config文件和global没有先后执行的顺序,只是视具体的信息什么时候会被加载和处理。 

  • 相关阅读:
    用Maven插件生成Mybatis代码
    年薪50万的大数据分析师养成记
    利用 index、explain和profile优化mysql数据库查询小结
    perl MQSeries::Queue sync方法
    新零售不简单,当初马云自己都没解释清楚!
    新零售不简单,当初马云自己都没解释清楚!
    elasticsearch 默认不支持检索hadoop
    以不能久驻世上的心态处理日常事务——北漂18年(89)
    数据化管理在餐饮业中的应用
    解决Linux出现"Device eth0 does not seem to be present"问题
  • 原文地址:https://www.cnblogs.com/May-day/p/5822446.html
Copyright © 2011-2022 走看看