asp.net

位置:IT落伍者 >> asp.net >> 浏览文章

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


发布日期:2024年07月03日
 
浅谈ASP.NET的内部机制(二)

上次已经说到了httpsys和aspnet_filter的功能希望大家还记得!

当一个请求(也就是http Request)通过了httpsys和aspnet_fitler后此时这个请求还没有被传递给ASPNET的处理程序但是此时IIS就会在它的MIME Type中查找请求文件的处理程序

其实MIME Type不神秘就是注册了哪些文件由哪些组件来处理大家看看下面的图就明白了

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

下面我们就来详细的看看在真正处理一个请求的时候到底进行了哪些的初始化操作

当IIS知道了处理的是aspx的文件后就启动一个进程wwpexe来开始运行ASPNET

因为此时aspnet_isapidll已经加载运行了而且aspnet_isapidll是一个用托管代码编写的组件而所有的托管代码都要运行在应用程序域(Application Domain以后我们简称Domain)中所以进行加载后首先就是建立一个Domain因为我们请求的是一个ASPNET中的一个页面而且这个页面是属于一个用ASPNET开发的网站所以这个网站就是一个应用程序要在Domain中运行的但是建立一个Domain要经过很多的步骤的(注大家也许认为没有必要把建立Domain的步骤弄清楚但是我认为很有必要因为在建立一个Domain的过程中涉及到很多的ASPNET的内部问题而且这个问题在实际开发中也很重要如ASPNET运行时的权限和可信域(与安全问题相关)也涉及代码安全等还可以帮助我们理解代码的编译)

下面就来说说建立一个Domain的步骤

为一个Domain建立标识

验证访问的文件目录是否存在并且初始化目录的信息

设置Domain的信任级别

设置程序集的位置

得到自动生成的机器码

初始化ASPNET编译系统

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

因为一个应用程序是运行在服务器的硬盘上的所以在运行的时候必须有一个标识(identity)其实标识就是运行程序的用户名和ID这是操作系统要的在IIS一个ASPNET程序就是以NT AUTHORITY\NETWORK SERVICE的身份来运行的因为不同的identity对系统的操作权限不同我们可以在配置文件如nfig中配置别的权限使得我们的程序可以进行更多的操作(如写入文件读取系统注册表等)只要配置<identity />

其次我们来看看 验证访问的文件目录是否存在并且初始化目录的信息

一个ASPNET网站的由很多的文件组成的如果我们请求的的文件在这个网站中没有或者我们没有读取那个文件的权限那么就会产生从服务器返回错误的信息

而且ASPNET还会初始化一些目录的信息如在App_Data中的文件因为Net Framework以后的版本ADONET的还会自己的把数据文件与Sql Server相连并且建立连接

最后就是还会决定一个ASPNET的网站的自动产生的代码回放在哪里比如我们请求一个Defaultaspx页面这个页面还有一个cs文件在我们请求时这两个文件会生成一个继承Page的类所以ASPNET必须决定这个生成的文件放在哪里

然后我们来看看 设置Domain的信任级别

其实一个Domain的信任级别就决定了这个Domain可以做哪些事情也就是一个Domain的权限有多大

主要有Enterprise Machine User Application domain

其实这也是一个代码访问安全的问题(code access security (CAS))就是说这个Domain中的应用程序的代码可以执行的操作的权限比如如果Domain的信任级别很大甚至程序中的代码可以访问Windows API

我们可以在调用SystemAppDomainCurrentDomainSetAppDomainPolicy来设置级别

再次我们来看看 设置程序集的位置

上面的一些步骤就已经建立了一个Domain的安全策略一个Domain中运行的网站一般会有一些程序集的而且位于bin目录下还有之前提过的自动的类也会会被编译为程序集NET Framework会监管这些程序集

再后我们来看看 得到自动生成的机器码

其实机器码就是machineKey每个应用程序在运行的时候都会有machineKey一般是ASPNET随机生成的但是我们也可以自动的制定在nfig的<machineKey />中制定这个功能很有用的比如你有几个服务器或者几个不同的网站我们希望在一台服务器上的网站登录后然后我们在其他的服务器的网站上去的时候我们就可以是已经登录用户也就是可以实现一次登录到处可用

最后就是 初始化ASPNET编译系统

这时就编译程序集并且解析其中的类而且还解析app_webreferences的目录和globalasax程序开始运行了也有了Application的实例来主导整个应用

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

上一篇:Asp.net,C# 加密解密字符串

下一篇:在Asp.net用C#建立动态Excel