浅谈ASP.NET的内部机制(二)
 
      前言:大家知不知道,一个Http Request是如何被传递给ASP.NET的?而且ASP.NET是如何知道一个 Http Request是请求的.aspx这样的动态文件还是请求的.htm这样的静态文件?......

系列文章链接:

浅谈ASP.NET的内部机制(一)

浅谈ASP.NET的内部机制(二)

浅谈ASP.NET内部机制(三)

浅谈ASP.NET内部机制(四)

浅谈ASP.NET内部机制(五)

浅谈ASP.NET内部机制(六)

浅谈ASP.NET内部机制(七)

浅谈ASP.NET内部机制(八)

上次已经说到了http.sys和aspnet_filter的功能,希望大家还记得!       当一个请求(也就是http Request)通过了http.sys和aspnet_fitler后,此时这个请求还没有被传递给ASP.NET的处理程序。但是此时IIS就会在它的MIME Type中查找请求文件的处理程序。       其实MIME Type不神秘,就是注册了哪些文件由哪些组件来处理。大家看看下面的图就明白了。

大家应该对上面的图很熟悉。而IIS就是通过查找上面的那个表来决定一个请求到底请求的是那种文件,如果是静态的文件,如htm,那么这个请求就直接由IIS来处理了,也不会传递给ASP.NET处理程序。如果请求的文件是.aspx或者.asmx等,那么IIS就知道请求是就传递给aspnet_isapi.dll的,随后就启动一个进程来加载这个dll,随后就开始进行一系列的初始化工作,然后就把请求传递给ASP.NET。

下面我们就来详细的看看,在真正处理一个请求的时候,到底进行了哪些的初始化操作。
      1.当IIS知道了处理的是.aspx的文件后,就启动一个进程w3wp.exe来开始运行ASP.NET。
      2.因为此时aspnet_isapi.dll已经加载运行了,而且aspnet_isapi.dll是一个用托管代码编写的组件,而所有的托管代码都要运行在应用程序域(Application Domain,以后我们简称Domain)中,所以进行加载后,首先就是建立一个Domain。因为我们请求的是一个ASP.NET中的一个页面,而且这个页面是属于一个用ASP.NET开发的网站,所以这个网站就是一个应用程序,要在Domain中运行的。但是建立一个Domain要经过很多的步骤的。(注:大家也许认为没有必要把建立Domain的步骤弄清楚,但是我认为很有必要,因为在建立一个Domain的过程中,涉及到很多的ASP.NET的内部问题,而且这个问题在实际开发中也很重要,如ASP.NET运行时的权限和可信域(与安全问题相关),也涉及代码安全等,还可以帮助我们理解代码的编译).

下面就来说说建立一个Domain的步骤:
      2.1 为一个Domain建立标识;
      2.2 验证访问的文件目录是否存在,并且初始化目录的信息
      2.3 设置Domain的信任级别
      2.4 设置程序集的位置
      2.5 得到自动生成的机器码
      2.6 初始化ASP.NET编译系统

首先,我们来看看 为一个Domain建立标识。

因为一个应用程序是运行在服务器的硬盘上的,所以在运行的时候必须有一个标识(identity),其实标识就是运行程序的用户名和ID,这是操作系统要的。在IIS6中,一个ASP.NET程序就是以NT AUTHORITY\NETWORK SERVICE的身份来运行的。因为不同的identity对系统的操作权限不同,我们可以在配置文件,如web.config中配置别的权限,使得我们的程序可以进行更多的操作(如写入文件,读取系统注册表等),只要配置<identity />。
 
      其次,我们来看看 验证访问的文件目录是否存在,并且初始化目录的信息。
 一个ASP.NET网站的由很多的文件组成的。如果我们请求的的文件在这个网站中没有或者我们没有读取那个文件的权限,那么就会产生从服务器返回错误的信息。
 
      而且ASP.NET还会初始化一些目录的信息,如在App_Data中的文件,因为.Net Framework2.0以后的版本,ADO.NET的还会自己的把数据文件与Sql Server相连,并且建立连接。
 
      最后就是还会决定一个ASP.NET的网站的自动产生的代码回放在哪里。比如我们请求一个Default.aspx页面,这个页面还有一个.cs文件,在我们请求时,这两个文件会生成一个继承Page的类,所以ASP.NET必须决定这个生成的文件放在哪里。
 
      然后,我们来看看 设置Domain的信任级别。
      其实一个Domain的信任级别就决定了这个Domain可以做哪些事情。也就是一个Domain的权限有多大。
      主要有:1.Enterprise 2. Machine 3. User 4. Application domain。
 其实这也是一个代码访问安全的问题(code access security (CAS)).就是说,这个Domain中的应用程序的代码可以执行的操作的权限。比如,如果Domain的信任级别很大,甚至程序中的代码可以访问Windows API。
 我们可以在调用System.AppDomain.CurrentDomain.SetAppDomainPolicy,来设置级别。
 
      再次,我们来看看 设置程序集的位置。
      上面的一些步骤就已经建立了一个Domain的安全策略,一个Domain中运行的网站一般会有一些程序集的,而且位于bin目录下,还有之前提过的自动的类也会会被编译为程序集,.NET Framework会监管这些程序集。
 
      再后,我们来看看 得到自动生成的机器码。
      其实机器码就是machineKey,每个应用程序在运行的时候,都会有machineKey,一般是ASP.NET随机生成的,但是我们也可以自动的制定,在web.config的<machineKey />中制定。这个功能很有用的,比如你有几个服务器,或者几个不同的网站,我们希望在一台服务器上的网站登录后,然后我们在其他的服务器的网站上去的时候,我们就可以是已经登录用户。也就是可以实现"一次登录,到处可用"。
 
      最后,就是 初始化ASP.NET编译系统。
      这时就编译程序集,并且解析其中的类,,而且还解析app_webreferences的目录和global.asax。程序开始运行了,也有了Application的实例来主导整个应用。

今天就说到这里。下篇接着说。

转载于:https://www.cnblogs.com/yanyangtian/archive/2009/02/22/1395995.html

浅谈ASP.NET的内部机制(二)相关推荐

  1. 浅谈ASP.NET的内部机制(一)

    浅谈ASP.NET的内部机制(一) 前言:当一个Http请求发送给一个aspx页面时,服务器进行了哪些操作?又如何来解析这个请求?ASP.NET在接收请求后是怎么运行的,如怎么编译以及怎么样用托管的代 ...

  2. 浅谈ASP.NET内部机制(五)

    浅谈ASP.NET内部机制(五) 前言:本章要谈页面生命周期了,过程挺多的,但是一点都不难.不信可以看看.我尽量的讲的平实一些,而且理解页面的生命周期对喜欢开发自定义控件和组件的朋友是很有帮助的. 系 ...

  3. EOS入门(8)---浅谈EOS的DPOS共识机制

    EOS入门(8)---浅谈EOS的DPOS共识机制  光_武 关注 2018.03.17 14:13 字数 3873 阅读 1534评论 1喜欢 2 本文参考汤强公众号的一篇文章坐看邻国领袖打高尔夫球 ...

  4. 浅谈Linux PCI设备驱动(二)

    我们在浅谈Linux PCI设备驱动(一)中(以下简称浅谈(一) )介绍了PCI的配置寄存器组,而Linux PCI初始化就是使用了这些寄存器来进行的.后面我们会举个例子来说明Linux PCI设备驱 ...

  5. 浅谈纯远程配置树莓派(二)

    浅谈纯远程配置树莓派(二) --简单配置.通过SSH访问及配置向导介绍 前情提要:上篇(链接:http://blog.csdn.net/octsjimmy/article/details/700455 ...

  6. 浅谈python的垃圾回收机制以及内存管理

    背景介绍 Python语言默认采用的垃圾收集机制是『引用计数法 Reference Counting』,该算法最早George E. Collins在1960的时候首次提出,50年后的今天,该算法依然 ...

  7. 老杨说运维 | 2023,浅谈智能运维趋势(二)

    (文末附视频,一键观看精彩内容) 前言: 上文提到了智能运维现状中的变化趋势以及 上文提到了智能运维现状中的变化趋势以及过往误区,老杨认为智能运维的体系化建设还需从抓牢数据治理为起点,以终为始做好规划 ...

  8. 浅谈ASP.NET的Postback

    说道ASP.NET的Postback,就得说Web Page的生命周期,但是Web Page的生命周期却不是三言两语就能够说得清楚的,所以在这里单纯站的编程的角度,撇开Web Page 的生命周期浅谈 ...

  9. 浅谈SpaceBuilder系统的缓存机制_缓存思想

    在前面的文章中也提及到为了提高系统的性能,SpaceBuilder在内部做了大量的工作,而数据缓存就是其中非常高效的处理方式. 我们知道SpaceBuilder采用了多层架构的处理模式,数据通过业务实 ...

最新文章

  1. android getevent参数,android getevent、sendevent、input keyevent 使用说明
  2. 构造函数中调用构造函数new和delete使用小结
  3. [转]为什么我们不用软件工程?软件工程能帮多大忙?
  4. uri和url的区别
  5. 程序员在网吧写代码被暴打一顿!
  6. 探索未知种族之osg类生物---呼吸分解之更新循环一
  7. 二、Java 面向对象高级——Collection、泛型
  8. Visual Studio Code(VScode)设置为中文界面
  9. 同一个浏览器打开不同端口的程序登录_【BI报表制作】单点登录与个性化开发...
  10. 2场直播丨MySQL 数据库最常见的 6 类故障的排除方法、2020数据技术嘉年华·金融峰会暨数据库大咖讲坛(第4期)...
  11. [物理学与PDEs]书中的错误指出
  12. 豪华酒店介绍预订网站模板,里面总共7个页面,适合酒店预订相关网站模板下载。
  13. eclipse 输入光标由于误操作变成小黑块如何恢复
  14. 大数据抗疫的“洪荒之力”:多地政府借力大数据技术,多家企业上马大数据产品...
  15. 软件工程考试归纳知识点
  16. 用PYTHON画谢尔宾斯基三角形(代码可复制)
  17. 实例解读模拟电子技术完全学习与应用
  18. Add-Migration
  19. 数据库--死锁产生原因及解决方法
  20. 使用Java语言打印一个爱心图案

热门文章

  1. centos部署时间服务器
  2. java元注解 @Documented注解使用
  3. python新建以时间命名的目录
  4. HDU 3377 插头dp
  5. 线性电源与开关电源的区别
  6. Android File数据存储
  7. 7-20 打印九九口诀表 (15 分)
  8. html网页主题结构,常用html元素总结包括基本结构、文档类型、头部、主体等等...
  9. c语言能让制表符空9个字符码,C语言入门9-1-分类函数
  10. 4010-基于邻接矩阵的边的删除(C++,附思路)