[ASP.NET学习笔记之三十]ASP.NET 2.0的代码隐藏和编译模型

回顾

回顾ASP.NET 1.x代码模型

传统的ASP模型(代码内联)

直接在ASPX文件中编写代码,适用于简单的命令

代码隐藏模型

将业务逻辑和事件处理代码写入一个只有代码的文件中(代码隐藏文件)

允许设计人员处理呈现文件而让开发人员处理代码文件,则开发小组的工作速度可以更快

ASP.NET 1.x 代码模型

ASP.NET 1.x 代码隐藏模型的特点

虽然从编程的意义上来说ASPX 页继承了代码隐藏文件,但实际上两个文件通过一种更为复杂的关系连接在一起

继承的复杂性

ASP.NET 的设计范例是,开发人员将使用Microsoft VisualStudio .NET 将控件拖放到ASPX 页面。然后,Visual Studio将自动在代码隐藏文件中生成适当的支持代码。

如果将控件添加到ASPX 页,就必须将新代码添加到代码隐藏文件。

换句话说,实际上是ASPX 页驱动代码隐藏文件的设计

ASP.NET 1.x 代码隐藏模型的特点

编译的复杂性

所有的代码隐藏文件,连同支持类,都编译到一个程序集并存储在Web 应用程序的/bin 目录中

ASPX 页在第一次请求该页的运行时进行编译。ASP.NET 运行库实际上将ASPX 页编译到它自己的临时程序集中

在没有更新代码隐藏程序集的情况下可以更改ASPX

也就是说,部署之后开发人员可能选择修改ASPX 页的一个属性或者更改控件的类型,但既没有更新代码隐藏文件,也没有重新编译应用程序程序集。当发生这种情况时,因为代码隐藏文件和它们相关的ASPX 页不匹配,所以应用程序将会遇到不可预料的错误。

ASP.NET 1.x

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs"

AutoEventWireup="false" Inherits="CMTest.WebForm1" %>

 

ASP.NET 2.0 代码模型

ASP.NET 2.0 代码模型

ASP.NET 2.0 继续提供代码内联和代码隐藏编码模型。就代码内联模型而言,除了Microsoft Visual Studio 支持单文件开发之外,几乎没有变化

ASP.NET 2.0 通过修改代码隐藏文件的特性,解决了代码隐藏模型的继承和编译问题

ASP.NET 2.0 中,代码隐藏文件不再是System.Web.UI.Page 类的完整实现。取而代之的是,代码隐藏文件是一种称为局部类的新结构。这种局部类包含所有用户定义的代码,但是省略由Visual Studio .NET ASP.NET1.x 中自动生成的所有基础结构和连接代码。当请求一个具有新代码隐藏文件的ASPX 页面时,ASP.NET 2.0 运行时会真正地将ASPX 页和局部类合并为一个类,而不是两个单独的类。

ASP.NET 2.0

<%@ Page Language="C#" AutoEventWireup="true"

CodeFile="Default.aspx.cs" Inherits="_Default" %>

 

ASP.NET 1.x 2.0的代码隐藏文件比较

namespace ASP.NET 1.x

{

public class WebForm1 : System.Web.UI.Page

{

protected System.Web.UI.WebControls.Label Label1;

private void Page_Load(object sender, System.EventArgs e) { }

#region Web Form Designer generated code

protected override void OnInit(EventArgs e)

{

InitializeComponent();

base.OnInit(e);

}

private void InitializeComponent()

{

this.Load += new System.EventHandler(this.Page_Load);

}

#endregion

}

}

 

namespace ASP.NET2.0

{

public partial class Webform1_aspx : System.Web.UI.Page

{

void Page_Load(object sender, EventArgs e)

{

Label1.Text = "Hello ASP.NET 2.0";

}

}

}

 

ASP.NET 2.0代码模型

 

ASP.NET 2.0 代码模型的特点

事件语法可以通过Visual Studio 生成。获得的代码隐藏文件更为简短并且不受自动生成代码的影响。ASP.NET 运行库自动将代码隐藏中的事件连接到ASPX 中的控件。换句话说,ASP.NET 运行库现在自动执行代码生成,而过去这由Visual Studio 完成。

继承的复杂性

这种新代码隐藏模型大大降低了继承的复杂性。因为ASPX 页不直接继承代码隐藏文件,所以代码隐藏文件不再需要定义和支持ASPX页上定义的所有控件。

同样,代码隐藏文件可以自动访问ASPX 页上的任何控件,而不需要ASP.NET 1.x 中所需的声明代码。ASP.NET 运行库自动将所需要的声明和事件连接代码插入到最终的已编译文件中

在设计期间,链接由Visual Studio 维护。Visual Studio 环境利用ASP.NET 运行库编译块来确保代码开发人员和Web 开发人员可以同步工作。

编译的复杂性

因为这种新的代码隐藏文件与ASPX 页连接并在运行时编译成一个完整类,所以不会出现编译的复杂性。也就是说,代码隐藏文件自动与ASPX 页同步。即使是使用这种新编译模型,仍可能有不同步的代码,但可以很快找到这种问题,因为产生的异常更为清楚。

 

ASP.NET 1.x 2.0的代码模型的比较

 

ASP.NET 2.0 编译原理

由于ASP.NET 1.x 中引入了页模型,ASP.NET Web 页的编译过程总是分成两个阶段。首先,代码隐藏文件和其他支持类编译到一个程序集中,然后在运行时编译单独的ASPX 文件。

ASP.NET 1.x 中的编译

 

虽然这种模型有优点,但它也有两个主要缺点

ASPX 页必须要以人们可以阅读的形式部署到Web 站点。如果开发人员使用代码内联模型,这意味着,一些(或所有)的业务逻辑也可以部署在生产服务器上。由此产生的代码安全问题。

     第一次有人请求某Web 页时,响应速度将比正常速度慢一些,原因在于ASP.NET 运行库必须编译ASPX页。

 

ASP.NET 2.0 编译模型

1. 普通(ASP.NET 1.x)

在一个普通的ASP.NET Web 应用程序中,代码隐藏文件被编译到一个程序集并存储在/bin 目录中。根据要求编译Web (ASPX)。该模型对大多数Web 站点都运行得不错。但是,编译过程使得第一次请求ASP.NET 页时的速度比随后的请求速度缓慢

 

2. 部署预编译

     ASP.NET 2.0 的一种新功能,允许在部署前对项目进行完整编译

     在完整编译中,所有的代码隐藏文件、ASPX 页面、HTML、图形资源以及其他的后端代码都被编译到一个或多个可执行程序集中,这取决于应用程序的大小和编译设置

     这些程序集包含所有的已编译Web 站点代码,而资源文件和配置文件被复制,没有做修改。

     这种编译方法以牺牲修改部署后Web 站点的能力为代价,提供了最好的性能和安全性。

      

3. 完整的运行时编译

     在部署预编译的另一个极端,ASP.NET 2.0 提供一种在运行时编译整个应用程序的新机制

     也就是说,可以将未编译的代码隐藏文件和其他相关的代码放在/app_code 目录中,并让ASP.NET 2.0 创建并维护对程序集的引用,这些引用将在运行时根据这些文件生成。

     这种选项以在服务器上存储未编译代码为代价,在更改Web站点内容方面提供了最大的灵活性。

完整的运行时编译(/app_code 目录)

/app_code 目录是一个保存未编译类的特殊目录

在运行时,ASP.NET 运行库将该目录中的内容编译到一个程序集中,应用程序中的ASPX 页自动引用该程序集

换句话说,通过使用代码目录,可以避免为支持代码创建和引用单独的程序集

代码目录的优点在于,不用完整编译项目就可以部署,因此减少了不匹配的可能

缺点是,有可能在服务器上公开未编译的代码

该选项最适合于不需要大量支持代码(以代码隐藏文件的形式或外部对象的形式)的ASP.NET 应用程序。对于一个简单的应用程序,与更为健壮的编译方法相比,快速部署和测试系统的功能提供了几个优点

 

4. 批编译

ASP.NET 2.0 中,可以利用单个URL 请求来批编译任何应用程序。

如同ASP.NET 1.x 一样,批编译消除了第一次页面请求的延时,但造成了更长的启动周期

批编译的优点是,第一个用户可以立即使用页面,而且在批编译期间可以检测到ASPX 页中的任何错误。但是,批编译的确增加了应用程序启动的延时,并且必须要内置在Web.config 文件中

     如果某个文件出现了问题,则该批将不会接收它,继续单页编译

QASP.NET2.0可以增加App_codeApp_Data等目录,我想这样设置和多层架构有关吗,这让我联想到了App_code为逻辑层,App_Data为数据层

AApp_CodeApp_Data等目录是ASP.NET 2.0的一些保留文件夹。这些目录的保留是为了更好地组织ASP应用程序,这和多层架构是没有关系的。你可以把一些站台的支持类和工具类放在App_Code目录中,因为App_Code目录中的类会被ASP.NET 运行时编译成一个单独的程序集,并且所有的页面会自动引用该程序集。App_Data目录包含应用程序数据文件,包括 MDF 文件、XML 文件和其他数据存储文件。ASP.NET 2.0 使用 App_Data 文件夹来存储应用程序的本地数据库,该数据库可用于维护成员资格和角色信息。类似的保留目录还有:App_Browsers, App_GlobalResources, App_LocalResources, App_Themes, App_WebReferences。关于这些目录的一些用法说明可以参考MSDN的帮助。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第4章 ASP.NET的网代码模型及生命周期 从本章开始,就进入了ASP.NET应用程序开发的世界。在了解了C#的结构,以及面向对象的概念后,就可以从面向对象的思想开发ASP.NET应用程序。在ASP.NET中,能够使用面向对象的思想和软件开发中的一些思想,例如封装、派生、继承以及高级的设计模式等。本章首先介绍ASP.NET中最重要的概念---网代码模型。 4.1 ASP.NET的网代码模型ASP.NET应用程序开发中,微软提供了大量的控件,这些控件能够方便用户的开发以及维护。这些控件具有很强的扩展能力,在开发过程中无需自己手动编写。不仅如此,用户还能够创建自定义控件进行应用程序开发以扩展现有的服务器控件的功能。 4.1.1 创建ASP.NET网站 在ASP.NET中,可以创建ASP.NET网站和ASP.NET应用程序,ASP.NET网站的网元素包含可视元素和面逻辑元素,并不包含designer.cs文件。而ASP.NET应用程序包含designer.cs文件。创建ASP.NET网站,首先需要创建网站,单击【文件】按钮,在下拉菜单中选择【新建网站】选项,单击后会弹出对话框用于ASP.NET网站的创建,如图4-1所示。 图4-1 新建ASP.NET网站 在【位置】选项中,旁边的【下拉菜单】可以按照开发的需求来写,一般选择文件系统,地址为本机的本地地址。语言为.NET网站中使用的语言,如果选择Visual C#,则默认的开发语言为C#,否则为Visual Basic。创建了ASP.NET网站后,系统会自动创建一个代码隐藏模型面Default.aspx。ASP.NET一般由三部分组成,这三个部分如下所示。 q 可视元素:包括HTML,标记,服务器空间。 q 面逻辑元素:包括事件处理程序和代码。 q designer.cs文件:用来为面的控件做初始化工作,一般只有ASP.NET应用程序(Web Application)才有。 ASP.NET面中包含两种代码模型,一种是单文件模型,另一种是代码隐藏模型。这两个模型的功能完全一样,都支持控件的拖拽,以及智能的代码生成。 4.1.2 单文件模型 单文件模型中的所有代码,包括控件代码、事物处理代码以及HTML代码全都包含在.aspx文件中。编程代码在script标签,并使用runat=“server”属性标记。创建一个单文件模型,在【文件】按钮中选择【新建文件】选项,在弹出对话框中选择【Web窗体】或在右击当前项目,在下拉菜单中选择【添加新建项】选项即可创建一个.aspx面,如图4-2所示。 图4-2 创建单文件模型 在创建时,去掉【将代码放在单独的文件中】复选框的选择即可创建单文件模型ASP.NET文件。创建后文件会自动创建相应的HTML代码以便面的初始化,示例代码如下所示。 <%@ Page Language=“C#” %> <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”> <script runat=“server”> </script> <html xmlns=“http://www.w3.org/1999/xhtml”> <head runat=“server”> <title>无标题</title> </head> <body> <form id=“form1” runat=“server”> <div> </div> </form> </body> </html> 编译并运行,即可看到一个空白的面被运行了。ASP.NET单文件模型在创建并生成时,开发人员编写的类将编译成程序集,并将该程序集加载到应用程序域,并对该的类进行实例化后输出到浏览器。可以说,.aspx面的代码也即将会生成一个类,并包含内部逻辑。在浏览器浏览该面时,.aspx面的类实例化并输出到浏览器,反馈给浏览者。ASP.NET单文件模型运行示例图如图4-3所示。 图4-3 单文件模型 4.1.3 代码隐藏模型 代码隐藏模型与单文件模型不同的是,代码隐藏模型将事物处理代码都存放在cs文件中,当ASP.NET运行的时候,ASP.NET类生成时会先处理cs文件中的代码,再处理.aspx面中的代码。这种过程被成为代码分离。 代码分离有一种好处,就是在.aspx面中,开发人员可以将面直接作为样式来设计,即美工人员也可以设计.aspx面,而.cs文件由程序员来完成事务处理。同时,将ASP.NET中的面样式代码和逻辑处理代码分离能够让维护变得简单,同时代码看上去也非常的优雅。在.aspx面中,代码隐藏模型的.aspx代码基本上和单文件模型代码相同,不同的是在script标记中的单文件模型代码默认被放在了同名的.cs文件中,.aspx文件示例代码如下所示。 <%@ Page Language=“C#” AutoEventWireup=“true” CodeFile=“Default.aspx.cs” Inherits=“_Default” %> <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”> <html xmlns=“http://www.w3.org/1999/xhtml”> <head runat=“server”> <title>无标题</title> </head> <body> <form id=“form1” runat=“server”> <div> </div> </form> </body> </html> 从上述代码中可以看出,在头部声明的时候,单文件模型只包含Language=“C#”,而代码隐藏模型包含了CodeFile=“Default.aspx.cs”,说明被分离出去处理事物的代码被定义在Default.aspx.cs中,示例代码如下所示。 using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; //使用HtmlControls using System.Web.UI.WebControls; //使用WebControls using System.Web.UI.WebControls.WebParts; //使用WebParts public partial class _Default : System.Web.UI.Page //继承自System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } } 上述代码为Default.apx.cs代码。从上述代码可以看出,其格式与类库、编写类的格式相同,这也说明了.aspx面允许使用面向对象的特性,如多态、继承等。但是ASP.NET代码隐藏模型的运行过程比单文件模型要复杂,运行示例图如图4-4所示。 图4-4 代码隐藏模型 上述描述了代码隐藏模型面生成模型。当面被呈现之前,ASP.NET应用程序会解释并编译相应的cs文件中的代码,与此同时,ASP.NET应用程序还会将.aspx面进行编译并生成.aspx面对应的类。生成.aspx面对应的类后会将该类与cs文件中的类进行协调生成新的类,该类会通过IIS在用户浏览面时呈现在用户的浏览器中。 4.1.4 创建ASP.NET Web Application ASP.NET网站有一种好处,就是在编译后,编译器将整个网站编译成一个DLL(动态链接库),在更新的时候,只需要更新编译后的DLL(动态链接库)文件即可。但是ASP.NET网站却有一个缺点,编译速度慢,并且类的检查不彻底。 相比之下,ASP.NET Web Application不仅加快了速度,只生成一个程序集,而且可以拆分成多个项目进行管理。创建Application,首先需要新建项目用于开发Web Application,单击菜单栏上的【文件】按钮,在下拉菜单中选择【新建项目】选项,在弹出窗口中选择【ASP.NET应用程序】选项,如图4-5所示。 图4-5 创建ASP.NET应用程序 在创建了ASP.NET应用程序后,系统同样会默认创建一个Default.aspx面,不同的是,多出了一个Default.aspx.designer.cs,用来初始化面控件,一般不需要修改。 4.1.5 ASP.NET网站和ASP.NET应用程序的区别 在ASP.NET中,可以创建ASP.NET网站和ASP.NET应用程序,但是ASP.NET网站和ASP.NET应用程序开发过程和编译过程是有区别的。ASP.NET应用程序主要有以下特点: q 可以将ASP.NET应用程序拆分成多个项目以方便开发,管理和维护。 q 可以从项目中和源代码管理中排除一个文件或项目。 q 支持VSTS的Team Build方便每日构建。 q 可以对编译前后的名称,程序集等进行自定义。 q 对App_GlobalResources 的Resource强类支持。 ASP.NET WebSite编程模型具有以下特点: q 动态编译面,而不用编译整个站点。 q 当一部分面出现错误不会影响到其他的面或功能。 q 不需要项目文件,可以把一个目录当作一个Web应用来处理。 总体来说,ASP.NET网站适用于较小的网站开发,因为其动态编译的特点,无需整站编译。而ASP.NET应用程序适应大型的网站开发、维护等。 4.2 代码隐藏模型的解释过程 在ASP.NET代码隐藏模型中,一个完整的.aspx面包含两个面,分别是以.aspx和.cs文件为后缀的文件,这两个文件在形成了整个Web窗体。在编译的过程中都被编译成由项目生成的动态链接库(.DLL),同时,.aspx面同样也会编译。但是与.cs编译过程不同的是,当浏览者第一次浏览到.aspx面时,ASP.NET自动生成该的.NET类文件,并将其编译成另一个.DLL文件。 当浏览者再一次浏览该面的时候,生成的.DLL就会在服务器上运行,并响应用户在该面上的请求或响应,ASP.NET应用程序的解释过程图如4-6所示。 图4-6 代码隐藏模型面的执行过程 在客户端浏览器访问该面时,浏览器会给IIS发送请求消息,IIS则会开始执行ASP.NET编译过程,如果不存在编译过后的DLL文件,则加载编译的类并创建对象。当创建对象完成,生成创建对象后的代码并生成一个ASPX代码,该代码反馈给IIS,IIS再反馈成HTML面的形式给客户端。 4.3 代码隐藏模型的事件驱动处理 在传统的ASP开发中,ASP的事件都是按照网的顺序来处理的,一般情况下,ASP面的事件都是从上到下处理事件,可以说ASP的开发是一个线性的处理模型。在用户的浏览操作中,每一次用户的操作都会导致面重新被发送到服务器。因此,重复的操作必然导致客户端和服务器的往返过程,服务器必须重新创建面,当创建面后,服务器再按照原来的从上到下的顺序进行事件处理。 在ASP.NET中,通过使用模拟事件驱动模型的行为代替了ASP的线性处理模型ASP.NET框架模型隐式的为用户建立了事件和事件处理程序的关联。ASP.NET让用户可以为从浏览器传递的事件在服务器代码中设置相应的处理程序。假设某个用户正在浏览网站并与面之间产生了某种交互,用户的操作就会引发事件,事件通过HTTP被传输到服务器。在服务器中,ASP.NET框架解释信息,并触发事件与之对应的处理程序。该程序可以是.aspx面中的处理程序,也可以是开发者自定义的类库,或者COM组件等。事件驱动处理如图4-7所示。 图4-7 面框架的事件驱动处理模型 上图则说明了当一个浏览者通过浏览器触发ASPX面时,浏览器、服务器服务器返回的过程。 4.4 ASP.NET客户端状态 Web开发不像软件开发,Web应用实际上是没有状态的,这就说明Web应用程序不自动指示序列中的请求是否来自相同的浏览器或客户端,也无法判断浏览器是否一直在浏览一个面或者一个站点,也无法判断用户执行了哪个操作并统计用户的喜好。 4.4.1 视图状态 从上面的章节中可以知道,当服务器每次的往返过程,都将销毁面并重新创建新的面。如果一个面中的信息超出了面的生命周期,那么这个面中的相关信息就不存在了。如果注销了面的信息,那么用户的一些信息可能就不存在了。 在ASP.NET中,网包含视图状态来保存用户的信息,视图状态在面发回到自身时,跨过程存储和用户自己的面的特定值,视图状态的优点如下所示。 q 不需要任何服务器资源。 q 在默认情况下,对控件启用状态的数据进行维护,不会被破坏。 q 视图状态的值经过哈希运算和压缩保护,安全性更高。 视图状态同样有一些缺点,缺点如下所示。 q 视图状态会影响性能,如果存储较大较多的值,则性能会有较大的影响。 q 在手机,移动终端上,可能无法保存视图状态中使用的值。 q 视图状态虽然安全性较高,但是还是有风险,如果直接查看代码,可以看到相应代码。 4.4.2 控件状态 ASP.NET中还提供了控件状态属性作为在服务器往返过程中存储自定义控件中的数据的方法。在面控件中,如果有多个自定义控件使用多个不同的控件来显示不同的数据结构,为了让这些面控件能够在在面上协调的工作,则需要使用控件状态来保护控件,同时,控件状态是不能被关闭的。同样,控件状态也有它的优点优点如下所示。 q 与视图状态相同的是,不需要任何服务器资源。 q 控件状态是不能被关闭的,提供了控件管理的更加可靠的方法。 q 控件状态具有通用性。 4.4.3 隐藏域 在ASP中,通常使用隐藏域保存面的信息。在ASP.NET中,同样具有隐藏域来保存面的信息,作为维护面状态的一种形式,但是隐藏域的安全性并不高,最好不要在隐藏域保存过多的信息。隐藏域具有以下优点。 q 不需要任何服务器资源。 q 支持广泛,任何客户端都支持隐藏域。 q 实现简单,隐藏域属于HTML控件,无需像服务器控件那样有需要编程知识。 而隐藏域具有一些不足,如下所示。 q 具有较高的安全隐患。 q 存储结构简单。 q 同样,如果存储了较多的较大的值,则会导致性能问题。 q 如果隐藏域过多,则在某些客户端中被禁止。 q 隐藏域将数据存储服务器上,而不存储在客户端。 注意:如果开发中,面的隐藏域过多,这些隐藏域被存储服务器。当客户端浏览面的时候,会有一些防火墙扫描面,以保证操作系统的安全,如果面的隐藏域过多,那么这些防火墙可能会禁止面的某些功能。 4.4.4 Cookie Cookie在客户端用户保存网站的少量的用户信息,服务器可以通过编程的方法获取用户信息,Cookie信息和面请求通常一起发送到服务器服务器对客户端传递过来的Cookie信息做处理。通常Cookie保存用户的登录状态、用户名等基本信息等等,在后面的章节会详细介绍使用ASP.NET操作Cookies。 4.4.5 客户端状态维护 虽然使用某些客户端状态并不使用服务器资源,但是这些状态都具有潜在的安全隐患,如Cookie。非法用户可以使用Cookie欺骗来攻击网站进行用户信息的获取,不过使用客户端状态能够使用客户端的资源从而提高服务器性能。使用客户端状态,虽然有安全隐患,但是具有良好的编程能力,以及基本的安全知识,能够较好的解决安全问题,同时也能够提高服务器性能。下面小结了一些客户端状态的优缺点。 q 视图状态:推荐当存储少量挥发到自身的面的信息时使用。 q 控件状态:不需要任何服务器资源,控件状态是不能被关闭的,提供了控件管理的更加可靠和更通用的方法。 q 隐藏域:实现简单,但是在应用程序中会造成一些安全隐患。 q Cookie:实现简单,同样也能够简单的获取用户的信息,但是Cookie有大小的限制,不适宜存储大量的代码。 4.5 ASP.NET面生命周期 ASP.NET面运行时,也同类的对象一样,有自己的生命周期。ASP.NET面运行时,ASP.NET面将经历一个生命周期,在生命周期内,该面将执行一系列的步骤,包括控件的初始化,控件的实例化,还原状态和维护状态等,以及通过IIS反馈给用户呈现成HTML。 ASP.NET面生命周期是ASP.NET中非常重要的概念,了解ASP.NET面的生命周期,就能够在合适的生命周期内编写代码,执行事务。同样,熟练掌握ASP.NET面的生命周期,可以开发高效的自定义控件。ASP.NET生命周期通常情况下需要经历几个阶段,这几个阶段如下所示。 q 请求:请求发生在生命周期开始之前。当用户请求一个面,ASP.NET将确定是否需要分析或者编译面,或者是否可以在不运行的情况下直接请求缓存响应客户端。 q 开始:发生了请求后,面就进入了开始阶段。在该阶段,面将确定请求是发回请求还是新的客户端请求,并设置IsPostBack属性。 q 初始化:在面开始后,进入了初始化阶段。初始化期间,面可以使用服务器控件,并为每个服务器控件进行初始化。 q 加载:面加载控件。 q 验证:调用所有的验证程序控件的Vailidate方法,来设置各个验证程序控件和的属性。 q 回发事件:如果是回发请求,则调用所有事件处理的程序。 q 呈现:在呈现期间,视图状态被保存并呈现到。 q 卸载:完全呈现面后,将面发送到客户端并准备丢弃时,将调用卸载。 4.6 ASP.NET生命周期中的事件 在面周期的每个阶段,面将引发可运行用户代码进行处理事件。对于控件产生的事件,通过声明的方式执行代码,并将事件处理程序绑定到事件。不仅如此,事件还支持自动事件连接,最常用的就是Page_Load事件了,除了Page_Load事件以外,还有Page_Init等其他事件,本节将会介绍此类事件。 4.6.1 面加载事件(Page_PreInit) 每当面被发送到服务器时,面就会重新被加载,启动Page_PreInit事件,执行Page_PreInit事件代码块。当需要对面中的控件进行初始化时,则需要使用此类事件,示例代码如下所示。 protected void Page_PreInit(object sender, EventArgs e) //Page_PreInit事件 { Label1.Text = “OK”; //标签赋值 } 在上述代码中,当触发了Page_PreInit事件时,就会执行该事件的代码,上述代码将Lable1的初始文本值设置为“OK”。Page_PreInit事件能够让用户在面处理中,能够让服务器加载时只执行一次而当网被返回给客户端时不被执行。在Page_PreInit中可以使用IsPostBack来实现,当网第一次加载时IsPostBack属性为false,当面再次被加载时,IsPostBack属性将会被设置为true。IsPostBack属性的使用能够影响到应用程序的性能。 4.6.2 面加载事件(Page_Init) Page_Init事件与Page_PreInit事件基本相同,区别在于Page_Init并不能保证完全加载各个控件。虽然在Page_Init事件中,依旧可以访问面中的各个空间,但是当面回送时,Page_Init依然执行所有的代码并且不能通过IsPostBack来执行某些代码,示例代码如下所示。 protected void Page_Init(object sender, EventArgs e) //Page_Init事件 { if (!IsPostBack) //判断是否第一次加载 { Label1.Text = “OK”; //将成功信息赋值给标签 } else { Label1.Text = “IsPostBack”; //将回传的值赋值给标签 } } 4.6.3 面载入事件(Page_Load) 大多数初学者会认为Page_Load事件是当面第一次访问触发的事件,其实不然,在ASP.NET生命周期内,Page_Load远远不是第一次触发的事件,通常情况下,ASP.NET事件顺序如下所示。 q 1. Page_Init()。 q 2. Load ViewState。 q 3. Load Postback data。 q 4. Page_Load()。 q 5. Handle control events。 q 6. Page_PreRender()。 q 7. Page_Render()。 q 8. Unload event。 q 9. Dispose method called。 Page_Load事件是在网加载的时候一定会被执行的事件。在Page_Load事件中,一般都需要使用IsPostBack来判断用户是否进行了操作,因为IsPostBack指示该是否正为响应客户端回发而加载,或者它是否正被首次加载和访问,示例代码如下所示。 protected void Page_Load(object sender, EventArgs e) //Page_Load事件 { if (!IsPostBack) { Label1.Text = “OK”; //第一次执行的代码块 } else { Label1.Text = “IsPostBack”; //如果用户提交表单等 } } 上述代码使用了Page_Load事件,在面被创建时,系统会自动在代码隐藏模型面中增加此方法。当用户执行了操作,面响应了客户端回发,则IsPostBack为true,于是执行else中的操作。 4.6.4 面卸载事件(Page_Unload) 在面被执行完毕后,可以通过Page_Unload事件用来执行面卸载时的清除工作,当面被卸载时,执行此事件。以下情况会触发Page_Unload事件。 q 面被关闭。 q 数据库连接被关闭。 q 对象被关闭。 q 完成日志记录或者其他的程序请求。 4.6.5 面指令 面指令用来通知编译器在编译面时做出的特殊处理。当编译器处理ASP.NET应用程序时,可以通过这些特殊指令要求编译器做特殊处理,例如缓存、使用命名空间等。当需要执行面指令时,通常的做法是将面指令包括在文件的头部,示例代码如下所示。 <%@ Page Language=“C#” AutoEventWireup=“true” CodeBehind=“Default.aspx.cs” Inherits=“MyWeb._Default” %> <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”> 上述代码中,就使用了@Page面指令来定义ASP.NET面分析器和编译器使用的特定的属性。当代码隐藏模型面被创建时,系统会自动增加@Page面指令。 ASP.NET面支持多个面指令,常用的面指令如下所示。 q @ Page:定义ASP.NET分析器和编译器使用的特定(.aspx文件)属性,可以编写为<%@ Page attribute=“value” [attribute=“value”…]%>。 q @ Control:定义ASP.NET分析器和编译器使用的用户控件(.ascx文件)特定的属性。该指令只能为用户控件配置。可以编写为<%@ Control attribute=“value” [attribute=“value”…]%>。 q @ Import:将命名空间显示导入到中,使所导入的命名空间的所有类和接口可用户该。导入的命名空间可以是.NET Framework类库或用户定义的命名空间的一部分。可以编写为<%@ Import namespace=“value” %>。 q @ Implements:提示当前或用户控件实现制定的.NET Framework接口。可以编写为<%@ Implements interface=“ValidInterfaceName” %>。 q @ Reference:以声明的方式指示,应该根据在其中声明此指令的对另一个用户控件或源文件进行动态编译和链接。可以编写为<%@ Reference page | control=“pathtofile” %>。 q @ Output Cache:以声明的方式空间ASP.NET中包含的用户控件的输出缓存策略。可以编写为<%@ Output Cache Duration=“#ofseconds” Location=“Any | Client | Downstream | Server | None” Shared=“True |False” VaryByControl=“controlname” VaryByCustom=“browser | customstring” VaryByHeader=“headers” VaryByParam=“parametername” %> q @ Assembly:在编译过程中将程序集链接到当前,以使程序集的所有类和接口都可用在该上。可以编写为<%@ Assembly Name=“assemblyname” %>或<%@ Assembly Src=“pathname” %>的方式。 q @ Register:将别名与命名空间以及类名关联起来,以便在自定义服务器控件语法中使用简明的表示法。可以编写为<%@ Register tagprefix=“ tagprefix” Namespace=“namepace” Assembly=“assembly” %>或<%@ Register tagprefix=“ tagprefix” Tagname=“tagname” Src=“pathname” %>的方式。 4.7 ASP.NET网站文件类型 在ASP.NET中包含诸多的文件类型,这些类型的文件由ASP.NET支持和管理,而除了这些文件以外,其他的文件都由IIS托管。使用VS2008能够创建大部分可以使用ASP.NET托管运行的程序。同时,使用应用程序映射可以将文件类型映射到应用程序。当需要伪静态时,很可能需要将.html后缀托管到IIS中的应用扩展,因为默认情况下ASP.NET不会处理HTML的操作。 技巧:现在的网站构架中,生成静态是一种降低网站压力的一种很好的解决方案。在某些情况下,服务器可能需要伪静态支持,就是将.aspx面后缀显式成.html后缀,让搜索引擎能够更好的搜录。 1.ASP.NET管理的文件类型 ASP.NET管理的文件类型能够在ASP.NET应用程序中被ASP.NET应用程序的不同模块进行访问和调用,这些文件可能是用户能够直接访问的,也有可能是用户无法直接访问的。ASP.NET管理的文件类型如表4-1所示。 表4-1 ASP.NET管理的文件类型 文件类型 保存位置 描述 .asax 根目录。 Global.asax 文件。包含 HttpApplication 对象的派生代码,用于重新展示 Application 对象。 .ascx 根目录或子目录。 可重用的自定义 Web 控件。 .ashx 根目录或子目录。 处理器文件。包含实现 IHttpHandler 接口的代码,用于处理输入请求。 .asmx 根目录或子目录。 XML Web Services 文件。包含由 SOAP 提供给其他 Web 应用的类对象和功能。 .aspx 根目录或子目录。 ASP.NET Web 窗体。包含 Web 控件和其他业务逻辑。 .axd 根目录。 跟踪视图文件。通常是 Trace.axd。 .browser App_Browsers 目录。 浏览器定义文件。用于识别客户端浏览器的可用特征。 .cd 根目录或子目录。 类图文件。 .compile Bin 目录。 定位于适当汇编集中的预编译文件。可执行文件(.aspx,.ascx,.master,theme)预编译后放在 Bin 目录。 .config 根目录或子目录。 Web.config 配置文件。包含用于配置 ASP.NET 若干特征的 XML 元素集。 .cs,.jsl,vb App_Code 目录。有些是 ASP.NET代码分离文件,位于与 Web 面相同的目录。 运行时被编译的类对象源代码。类对象可以是 HTTP 模块,HTTP 处理器,或 ASP.NET 面的代码分离文件。 .csproj,vbproj,vjsproj Visual Studio 工程目录。 Visual Studio 客户工程文件。 .disco,.vsdisco App_WebReferences 目录。 XML Web Services Discovery 文件。用于定位可用 Web Services。 .dsdgm,dsprototype 根目录或子目录。 分布式服务图表(DSD)文件。可添加到 Visual Studio 方案中,为反向引擎提供消耗 Web Services 时的交互性图表。 .dll Bin 目录。 已编译类库文件。作为替代,可将类对象源代码保存到 App_Code 目录。 .licx,.webinfo 根目录或子目录。 许可协议文件。许可协议有助于保护控件开发者的知识产权,并对控件用户的使用权进行验证。 .master 根目录或子目录。 模板文件定义 Web 面的统一布局,并在其他面中得到引用。 .mdb,.ldb App_Data 目录。 Access 数据库文件。 .mdf App_Data 目录。 SQLServer 数据库文件。 .msgx,.svc 根目录或子目录。 Indigo Messaging Framework(MFx)服务文件。 .rem 根目录或子目录。 远程处理器文件。 .resources App_GlobalResources 或 App_LocalResources 目录。 资源文件。包含图像,本地化文本,或其他数据的资源引用串。 .resx App_GlobalResources 或 App_LocalResources 目录。 资源文件。包含图像,本地化文本,或其他数据的资源引用串。 .sdm,.sdmDocument 根目录或子目录。 系统定义模型(SDM)文件。 .sitemap 根目录。 网站地图文件。包含网站的结构。ASP.NET 通过默认的网站地图提供者,简化导航控件对网站地图文件的使用。 .skin App_Themes 目录。 皮肤定义文件。用于确定显示格式。 .sln Visual Web Developer 工程目录。 Visual Web Developer 工程的项目文件。 .soap 根目录或子目录。 SOAP 扩展文件。 注意:ASP.NET 管理的文件类型映射到 IIS 的 Aspnet_isapi.dll。 2.IIS 管理的文件类型 在ASP.NET应用程序中,有些动态的文件如asp文件就不被ASP.NET应用程序框架管理,这些文件由IIS进行管理,由IIS管理的文件类型如表4-2所示。 表4-2 IIS管理的文件类型 文件类型 保存位置 描述 .asa 根目录。 Global.asa 文件。包含 ASP 会话对象或应用程序对象生命周期中的各种事件处理。 .asp 根目录或子目录. ASP Web 面。包含 @ 指令和使用 ASP 内建对象的脚本代码。 .cdx App_Data 目录. Visual FoxPro 的混合索引文件。 .cer 根目录或子目录。 证明文件。用于对网站的授权。 .idc 根目录或子目录。 Internet Database Connector(IDC)文件。被映射到 httpodbc.dll。 注意:由于无法为数据库连接提供足够的安全性,IDC 将不再被继续使用。IIS 6.0 是最后一个支持 IDC 的版本。 .shtm,.shtml,.stm 根目录或子目录。 包含文件。被映射到 ssinc.dll。 注意:IIS管理的文件类型被映射到IIS的asp.dll 3.静态文件类型 IIS仅提供已注册MIME类型的静态文件服务,注册信息保存在Mime Map IIS元数据库中。如果某种文件类型已经映射到指定应用程序,在不需要作为静态文件的情况之下,无需再在MIME类型列表中进行包含。默认的静态文件类型如表4-3所示。 表4-3 静态文件类型 文件类型 保存位置 描述 .css 根目录或子目录,以及 App_Themes 目录。 样式表文件。用于确定 HTML 元素的显示格式。 .htm,.html 根目录或子目录。 静态网文件。由 HTML 代码编写。 注意:虽然ASP.NET代码面也能够手动添加到MIME类型列表中,但是这样操作浏览者就能够看到面源代码,从而暴露ASP.NET面源代码,相对于服务器而言是非常不安全的。 4.8 小结 本章介绍了ASP.NET面生命周期,以及ASP.NET面的几种模型ASP.NET面生命周期是ASP.NET中非常重要的概念,熟练掌握ASP.NET生命周期能对ASP.NET开发,自定义控件开发起到促进作用。本章还介绍了: q 代码隐藏模型的解释过程。 q 代码隐藏模型的事件驱动处理。 q ASP.NET的客户端状态。 q ASP.NET面生命周期。 q ASP.NET生命周期中的事件。 q ASP.NET 网站文件类型。 上面的章节都分开的讲解了ASP.NET运行中的一些基本机制,在了解了这些基本运行机制后,就能够在.NET框架下做ASP.NET开发了。虽然这些都是基本概念,但是在今后的开发中,会起到非常重要的作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值