回顾
• 回顾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 文件中
– 如果某个文件出现了问题,则该批将不会接收它,继续单页编译
Q:ASP.NET2.0可以增加App_code或App_Data等目录,我想这样设置和多层架构有关吗,这让我联想到了App_code为逻辑层,App_Data为数据层
A:App_Code和App_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的帮助。