ASP.NET 2.0 的内部变化

asp.net

Jayesh Patel、Bryan Acker 和 Robert McGovern

Infusion Development

适用范围:

Microsoft ASP.NET 2.0

摘要:尽管 ASP.NET 2.0 与 ASP.NET 1.1 完全向后兼容,但还是为 ASP.NET 带来了大量的内部变化,包括代码模型、编译、页面生命周期等的变化。本文将概括介绍这些变化。

本页内容
引言
代码模型
编译
完全运行时编译(代码目录)
页面生命周期
可扩展性
高级缓存技术
性能
结论

引言
对于专业的 ASP.NET 开发人员来说,与 ASP.NET 2.0 有关的重要问题是内部发生了哪些变化。尽管新功能很有趣而且学起来很有意思,但对于真正想掌握这一技术的开发人员来说,ASP.NET 核心结构发生的变化才是最吸引他们的地方。在本白皮书中,我们将介绍自版本 1.x 以来,ASP.NET 2.0 内部结构发生了什么样的变化。

本白皮书介绍的主题对那些关注性能的开发人员以及寻求如何优化应用程序的技术设计师非常有用。具体来说,我们将介绍有关代码模型、编译、页面生命周期、可扩展性、性能和缓存的主要问题。

本文中的许多示例要求您对 ASP.NET、Visual Basic .NET 和/或 C# 语法有相当程度的了解。本文还在适当的地方提供了参考文档,就某些特定的主题展开深入的讨论。

返回页首
代码模型
也许 ASP.NET 2.0 内部工作方式最明显的变化是 ASP.NET Web 页面的创建方式的变化。本节将介绍内含代码模型发生的变化以及这些变化对 ASP.NET 开发的影响。

ASP.NET 1.x 中的代码模型
在 ASP.NET 1.x 中,供开发人员开发 Web 窗体的主要选择有两个。首先,开发人员可以参照传统的 ASP 模型并直接在 ASPX 页面中编写代码。此过程称为“内嵌代码”,它非常适用于简单的命令。然而,对于更复杂的代码而言,编写内嵌代码将为读取混合了表示 (HTML) 和功能(代码)的 Web 页面带来困难。在 ASP.NET 中,为了帮助解决这个问题,已更改了默认的编码方法。您可以在单独的、只包含代码的文件(称为“内含代码”文件)中编写业务逻辑和事件处理代码。内含代码模型将只包含代码的文件与包含表示标记的 ASPX 文件链接起来。通过将代码与表示相分离,开发小组可以让设计人员处理演示文件,而让开发人员处理代码文件,从而提高开发小组的工作效率。

图1:ASP.NET 1.x 代码模型

内含代码模型面临的主要困难在于如何将内含代码文件与 ASPX 页面保持同步。尽管从编程意义上来讲 ASPX 页面是从内含代码文件继承而来的,但实际上这两个文件是通过更复杂的关系联系在一起的。

有关 ASP.NET 1.x 中的内含代码模型的详细信息,请参见 MSDN Library 文章 Web Forms Code Model(英文)。

继承的复杂性
ASP.NET 的设计模式就是让开发人员使用 Microsoft Visual Studio .NET 将控件拖放到 ASPX 页面中。Visual Studio 然后将在内含代码文件中自动生成适当的支持代码。如果控件已被添加到 ASPX 页面中,则必须在内含代码文件中添加新代码。换句话说,尽管 ASPX 页面继承自内含代码文件,但实际上 ASPX 页面推动了内含代码文件的设计。

编译的复杂性
第二个同步问题就是如何编译文件。所有的内含代码文件以及所有的支持类都被编译到一个程序集中,并存储在 Web 应用程序的 /bin 目录中。应用程序的编译工作是在部署工作之前进行的。而另一方面,ASPX 页面也是在第一次被请求时在运行时编译的。ASP.NET 运行库实际上将 ASPX 页面编译到该页面自己的临时程序集中。

此过程的问题在于,无需更新内含代码程序集即可更改 ASPX 页面。也就是说,开发人员可以在部署后更改某个属性或更改 ASPX 页面上某个控件的类型,而无需更新内含代码文件,也不用重新编译应用程序的程序集。出现这种情况时,由于内含代码文件与所关联的 ASPX 页面不匹配,应用程序可能会遇到意外的错误。

ASP.NET 2.0 中的代码模型
ASP.NET 2.0 继续提供内嵌代码和内含代码模型。从内嵌代码模型的角度来说,除了 Microsoft Visual Studio 2005 支持单文件开发的方式有所变化外,基本上没做什么改动。有关 Visual Studio 2005 中的变化及其如何处理内嵌代码的详细信息,请参阅这篇文章(英文)。

ASP.NET 2.0 通过改变内含代码文件的本质解决了内含代码模型的继承和编译问题。在 ASP.NET 2.0 中,内含代码文件不再是 System.Web.UI.Page 类的完整实现。相反,内含代码文件是一个新的构造函数,称为“局部类”。局部类包含所有用户定义的代码,但是不包含 Visual Studio .NET 在 ASP.NET 1.x 中自动生成的任何管线和连接代码。请求包含新的内含代码文件的 ASPX 页面时,ASP.NET 2.0 运行库实际上将把 ASPX 页面和局部类合并成一个类,而不是两个单独的类。

图 2:ASP.NET 2.0 中的内含代码模型

局部类使用新的关键字(在 Visual Basic 中为 Expands,在 C# 中为 Partial)指示在运行时将该类中的代码与另一个类中的代码相合并。类似地,ASPX 页面使用新的指令(称为 compilewith)指示该页面与内含代码文件之间的关联。

比较内含代码文件
如果您熟悉传统的 ASP.NET 1.x 内含代码文件,您应该知道 Visual Studio 将插入自动生成的控件声明和初始化代码。这种自动生成的代码是内含代码文件与 ASPX 文件之间双向同步的直接结果。带有标签的典型 ASPX 页面具有一个对应的内含代码文件,该文件由许多自动生成的文本行构成。

列表 1:ASP.NET 1.x 中的内含代码文件

namespace WebApplication1
{
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
override protected void OnInit(EventArgs e)
{
InitializeComponent();
base.OnInit(e);
}
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}

自动生成的代码不仅定义标签(以粗体显示的行),还声明新的事件(页面加载)并自动将该事件绑定到自动生成的方法包装程序 (Page_Load())。

比较而言,同一个 ASP.NET 页面在 ASP.NET 2.0 中生成的内含代码文件更简洁。

列表 2:ASP.NET 2.0.x 中的内含代码文件

namespace ASP {
public partial class Webform1_aspx
{
}
}

开发人员可以自动访问 Label1,并根据需要添加事件。例如,可以添加 Page_Load 事件以初始化标签。

列表 3:在新的内含代码文件中添加事件

namespace ASP {
public partial class Webform1_aspx
{
void Page_Load(object sender, EventArgs e)
{
Label1.Text = "Hello ASP.NET 2.0";
}
}
}

事件语法可通过 Visual Studio .NET 生成。生成的内含代码文件更短,而且不包含任何自动生成的代码。ASP.NET 运行库会自动将内含代码文件中的事件绑定到 ASPX 页面上的控件。换句话说,ASP.NET 运行库现在可以自动执行代码生成,而这原本是由 Visual Studio 执行的。

继承的复杂性
新的内含代码模型大大降低了继承的复杂性。由于 ASPX 页面不是直接继承自内含代码文件,因此内含代码文件不再需要定义并支持 ASPX 页面上定义的所有控件。类似地,内含代码文件可以自动访问 ASPX 页面上的任何控件,而无需声明代码(声明代码在 ASP.NET 1.x 中是必需的)。这一切之所以能够实现,是因为 ASP.NET 运行库可以将所需的声明代码和事件绑定代码自动插入到最终编译的文件中。因为这些工作由运行库来完成,所以代码开发人员和 Web 开发人员都无需再担心这个问题。

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

编译的复杂性
由于新的内含代码文件与 ASPX 页面链接在一起并在运行时被编译到一个完整的类中,因此编译的复杂性不复存在。也就是说,内含代码文件将自动与 ASPX 页面保持同步。即使新的编译模型也可能包含未同步的代码,但由于产

时间: 2024-08-31 15:52:27

ASP.NET 2.0 的内部变化的相关文章

ASP.NET 2.0页面框架的几处变化

asp.net|页面 新增的页面事件:在ASP.NET 2.0中,一个ASP.NET页面的生命周期主要为(红色字体表示ASP.NET 2.0新增加的阶段页面事件):客户端请求页面->预初始化(OnPreInit)->初始化(OnInit)->完成初始化(OnInitComplete)->载入ViewState(LoadViewState)->处理回送数据(IPostBackDataHandler)->Page_OnPreLoad->Page_OnLoad->

Asp.Net4.0/VS2010新变化(6):内置的图表控件

.net4.0以前,要想在网页上画个饼图,那还真不是个轻松的活儿,得有点技术含量,比如:可以用System.Drawing下的那些东东,再或者用Silverlight/Flash或第三方控件   现在asp.net 4.0已经把它做成控件了   直接拖到页面就完事了,下面是示例代码: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inhe

ASP.NET 2.0页面框架的几处变化_XML/RSS

新增的页面事件: 在ASP.NET 2.0中,一个ASP.NET页面的生命周期主要为(红色字体表示ASP.NET 2.0新增加的阶段页面事件):客户端请求页面->预初始化(OnPreInit)->初始化(OnInit)->完成初始化(OnInitComplete)->载入ViewState(LoadViewState)->处理回送数据(IPostBackDataHandler)->Page_OnPreLoad->Page_OnLoad->回发更改通知(Rai

Asp.Net4.0/VS2010新变化(4):SEO的改进

asp.net4.0的webform中,对于Page对象新增加了二个属性:MetaKeywords,MetaDescription  后端代码上,写法也更简单,以前可能需要这样写: this.Header.Controls.AddAt(0, new HtmlMeta() { Name = "keywords", Content = Website.MetaKeyword });//关键字 this.Header.Controls.AddAt(1, new HtmlMeta() { Na

Asp.Net4.0/VS2010新变化(2):网站自动预热

往往我们会有一些web应用,在网站初次被访问时要做一些初始化处理,比如加载数据到缓存中之类. 如果某个用户正好不幸成为第一个访客,他可能会觉得网站速度很慢,现在好了,asp.net 4.0 IIS7.0/7.5环境提供了自动预热功能,相当于系统自动充当第一个访客了,虽然只是一个小细节,但对于用户体验来讲,确是一个不错的改进. 打开IIS 7.5的applicationHost.config文件(C:\Windows\System32\inetsrv\config\applicationHost.

[转]利用ASP.NET 2.0创建自定义Web控件(2)

原址:http://hi.baidu.com/sjbh/blog/item/5a8298454403a321cffca39c.html   如何生成的? Render() 方法基本上控制着 WebControl 的整个输出.默认情况下,Render() 方法实际上会依次调用 RenderBeginTag().RenderContents() 以及 RenderEndTag().尽管在 ASP.NET 1.x 中调用结构并未变化,但由于该呈现模型,修改这些调用的影响却发生了变化. 您可以覆盖 Re

ASP.NET 2.0服务器控件开发的基本概念

利用ASP.NET 2.0技术,创建Web自定义服务器控件并不是一件轻松的事情.因为,这需要开发人员了解并能够灵活应用多种Web开发技术,例如,CSS样式表.客户端脚本语言..NET开发语言.服务器控件开发技术,甚至是当前最火的AJAX技术等等.虽然现实如此"艰难",但是这种开发技术也不是真的难到不可掌握.事事都要从头做起.本文将针对利用asp.net 2.0技术,创建Web自定义服务器控件的基础知识进行详细介绍,内容包括:服务器控件概念.控件类型.生命周期等. ASP.NET 2.0

ASP.NET 2.0的新增服务、控件与功能

asp.net|控件 [导读]全文介绍了ASP.NET 2.0中新增的控件和功能,包括Master Pages,Data Source控件.Skin的支持.GridView和Details View的引入,在此基础上,ASP.NET 2.0的安全模型得到了极大的提高,包括登录控件.角色管理器.个性化等等方面的支持,在类库方面也增加了许多新特性,如全新的代码分隔模型.客户端回调等等,让读者对于ASP.NET的新特性有一个全面的了解. 在首次公诸于众以来的短短四年中,ASP.NET业已成为在Wind

ASP.NET 2.0 中的窗体身份验证

asp.net 概述 窗体身份验证使用用户登录到站点时创建的身份验证票,然后在整个站点内跟踪该用户.窗体身份验证票通常包含在一个 Cookie 中.然而,ASP.NET 2.0 版支持无 Cookie 窗体身份验证,结果是将票证传入查询字符串中. 如果用户请求一个需要经过身份验证的访问的页,且该用户以前没有登录过该站点,则该用户重定向到一个配置好的登录页.该登录页提示用户提供凭据(通常是用户名和密码).然后,将这些凭据传递给服务器并针对用户存储(如 SQL Server 数据库)进行验证.在 A