ASP.NET基础教程学习笔记:1、架构

一、基础

  ASP.NET的核心是.NET类,它们相互合作,对HTTP请求提供服务。基本构架如图:

  ASP.NET中所有的类都载入到ASP.NET工作者进程内的应用程序域,它们相互作用并响应相互的请求

1、一部分类在系统程序集中定义,作为基础类库的一部分,在.NET运行时装入;
2、一部分类被载入到GAC
3、一部分类从本地程序集中载入,本地程序集在与应用程序关联的虚拟目录中

  在ASP.NET中构建应用程序的过程就是构造一些类,这些类与基础框架中存在的类进行交互,最终的结果是许多类在一个进程中相互协作,并对一个请求提供服务。

进程模型(process model):ASP.NET工作者进程(worker process)是从IIS的进程inetinfo.exe中分离出来的一个单独的工作者进程:aspnet_wp.exe。asp.net的进程模型与IIS中有关的进程隔离设置无关,IIS所处理的许多任务都可以由asp.net在自己的工作者进程里完成。

 

二、编译和解释的区别

  第一次访问ASP.NET程序时,装载页面的速度很慢,因为第一次访问需要:

1、加载ASP.NET工作者进程
2、对.aspx文件进行语法分析,并编译成一个程序集
 

  传统的ASP是将服务端代码交给一个解释器,解释器对服务端脚本解释执行,执行结果并返回。这样导致了页面的生成效率,主要有:

(1)随机解释服务端脚本比在服务器上执行预编译的代码效率低
(2)要不断地调用解释器,混合使用静态html和服务端代码效率低
  ASP.NET网页始终被编译成.NET类,保存在程序集中。由于.NET类同时包含服务端代码和静态html代码,只要第一次访问了某个页面,以后生成该网页时只需要执行已编译的代码就可以了。已编译的组件和嵌入的服务端代码都是已编译的组件,所以不存在效率上的区别。
 

三、aspx继承的基类:Page

?首先来看看展示网页的类型以及网页继承的基类,
<div>
     PageType: <%Response.Write(this.GetType()); %><br />
     PageBaseType:<%Response.Write(this.GetType().BaseType); %>
</div>

 

输出结果:
 

  网页的类型为:ASP。buildpage_aspx,其中buildpage是自定义的aspx文件名,它是将文件名中的“.”替换成“_”而来的。而它的基类是Start.BuildPage,这个是自定义的aspx文件所关联的代码隐藏文件,而我们知道代码隐藏文件都是继承自Page类的。System.Web.UI.Page定义了asp.net中大多数用于请求处理的功能,默认情况下,所有的.aspx都继承自Page类。Page类包含很多成员和方法,用于处理请求。具体参考MSDN System.Web.UI.Page

 

四、代码隐藏

  前面提到的代码隐藏文件就是创建一种介于Page类和aspx类之间的中间基类,中间积累直接派生Page类,aspx类则派生自中间基类。这样的话,就可以从aspx页面中移除很多代码。我们可以在aspx的头部用Page指令的Inherits属性来设定aspx页面继承的中间基类。

所以此时类的层次结构是
 

事件处理

  Page基类继承自Control类,而Control类定义了4个事件:Init,Load,PreRender,Unload。在网页的生命周期中,依次激发这4个事件。

这四个事件的激发时间:
Init事件:在任何服务器状态还原完成之前
Load事件:在任何服务器状态还原完成之后,在激发服务器端事件之前
PreRender事件:激发所有服务端事件之后,返回HTML之前
Unload:网页生成完成之后

  最常用的事件就是Load事件,这里有两种出发Load事件处理函数的方法:

(1)VS默认情况下,aspx页面头部的@Page指令的AutoEventWireup属性为true,当该属性的值为true时,那我们只要在Page派生类中(通常就是页面的代码隐藏文件),以Page_Load,Page_Init等命名方式添加一个方法以及EventHandler委托所需的签名。在创建Page派生类时,初始化过程中就可以用reflection查找与这些名字匹配的函数,接着创建一个新委托并用函数初始化它并订阅相关事件
(2)使用AutoEventWireup这种技术需要依靠运行时类型信息查找方法的名称和执行事件的顺序,导致效率的下降,我们也可以将AutoEventWireup属性设置成false,然后重写OnInit虚函数来手动为Load事件订阅委托,如下
 1         protected override void OnInit(EventArgs e)
 2         {
 3             this.Load += Page_Load;
 4             base.OnInit(e);
 5         }
 6         protected void Page_Load(object sender, EventArgs e)
 7         {
 8             if (!IsPostBack)
 9             {
10                 personality.Items.Add(new ListItem("", "man"));
11                 personality.Items.Add(new ListItem("", "woman"));
12             }
13             Response.Write("test");
14         }

 

 

五、影子复制(shadow copy)

  传统的ASP程序中,只要程序正在运行或加载,都要保留一个到组文件的引用,要替换该文件就不得不关闭IIS。ASP.NET通过CLR提供的shadow copy机制防止了这种情况,即更新或替换文件都不必关闭iis的运行。

  在.NET中创建一个新的应用程序域时,可以将程序集的影子副本进行配置。AppDomainSetup类(该类初始化AppDomain)向外界提供一个Boolean类型的ShadowCopyFiles的属性和string类型的CachePath属性;AppDomain类提供一个SetShadowCopyPath()方法,用于启用应用程序域的影子复制功能,ShadowCopyFiles属性为特定应用程序域启用该机制,CachePath属性指定影子副本的基目录,SetShadowCopyPath方法指定哪个目录可以启动影子复制。

  ASP.NET为工作者进程的每一个应用程序都创建一个单独的应用程序域,每个域启用bin目录下的所有被引用的程序集的影子复制。程序集加载器不是从bin目录加载程序集,而是将所引用的程序集以物理方式复制到另一个单独的目录(应用程序的配置设置中指定该目录)并从这里加载。这种机制还能跟踪程序集的出处,所以更新bin目录里的文件后,会重新复制到影子目录中。

  除了影子复制,asp.net还必须能够临时创建和加载程序集。第一次引用aspx时,必须先编译成程序集,然后被asp.net加载。应用程序域支持动态目录(dynamic directory,用AppDomainSetup类的DynamicBase属性指定,用于存放动态创建的程序集)。

?

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。