完整的内容请参考下面微软官方的文章
http://www.microsoft.com/china/msdn/library/webservices/asp.net/dnvs05Internals.mspx?mfr=true
有几个有意思的地方
第一部分是编译模型不一样了
1. ASP.NET 2.0的编译模型不一样了。它通过局部类(Partial)的方式,真正把页面文件(aspx)和代码隐藏文件(aspx.cs)编译成一个类型,而不是以前那样有两个不同的类型。
2. 批编译的机制
3. 完整的运行时编译(\app_code 目录)
在目前描述的所有三种编译方法中,在部署前必须要编译所有的代码文件(代码隐藏类和支持类)。在 ASP.NET 2.0 中,您有代码目录。
\app_code 目录是一个保存未编译类的特殊目录。在运行时,ASP.NET 运行库将该目录中的内容编译到一个程序集中,应用程序中的 ASPX 页自动引用该程序集。换句话说,通过使用代码目录,可以避免为支持代码创建和引用单独的程序集。代码目录的优点在于,不用完整编译项目就可以部署,因此减少了不匹配的可能。缺点是,有可能在服务器上公开未编译的代码。
该选项最适合于不需要大量支持代码(以代码隐藏文件的形式或外部对象的形式)的 ASP.NET 应用程序。对于一个简单的应用程序,与更为健壮的编译方法相比,快速部署和测试系统的功能提供了几个优点。【这种做法,其实很类似ASP】
总结:因为批编译是会增加应用程序启动的时间的,而运行时编译除了增加运行时编译器工作量之外,还有代码安全风险。所以其实在ASP.NET 2.0中,还是首选:部署前预先编译。
第二部分是页面模型不一样了
1. 新增加了很多事件
|
2. 可以跨页提交
有的朋友一听到这个就很兴奋,其实也没有什么大惊小怪的。而且你实际上用到此特性的几率是很小的。
注意,不可能像下面这样写。就是说你不能去让runat=server的form自动提交到某个action。这是不允许的
如果这样做,你就会遇到一个类似下面的错误
这真是一个让人懊恼的错误提示,因为你根本不知道发生了什么事情。
要实现这样的需求,你可以通过在Button上面设置一个特殊的属性:PostBackUrl。
然后,整个世界就清净了。
果然是这样吗?其实不然,如果是这样提交的话,我们在WebForm1.aspx中如何得到目前页面的一些窗体域的值呢?或者说,WebForm1.aspx在加载的时候,又怎么知道自己是怎么被加载过来的呢?也就是说自己的前一页是什么?我们现在的需求是,在WebForm1.aspx中能不能读到下面的文本框(UserName)的值呢?
其实仍然是不难的。我们可以通过Request.Form集合读取
protected void Page_Load(object sender, EventArgs e)
{
Response.Write(Request.Form["UserName"]);
}
除此之外,ASP.NET 2.0还提供了一个新的途径,就是在页面(Page)这个对象上,多了一个属性:PreviousPage。可以这么说,这个Page就代表了完整的一个页面的引用。除了取得控件值之外,还可以做很多事情。
Response.Write((this.PreviousPage.FindControl("UserName") as TextBox).Text);
关于跨页提交,还有一个博客写得不错
http://activer.cnblogs.com/archive/2006/03/16/351274.html
第三部分是新的管道模型
通过开发自定义的HttpModule或者HttpHandler,可以改变ASP.NET执行引擎的行为
当 IIS 接收一个请求时,根据 IIS 的设置将扩展映射到一个 ISAPI 筛选器。将 .ASPX、.asmx、.asd 和其他扩展映射到 ASPnet_isapi.dll,该 ASPnet_isapi.dll 只是一种启动 ASP.NET 运行库的 ISAPI 筛选器。一旦请求到达 ASP.NET 运行库,它在 HTTPApplication 对象处启动,该对象担当 ASP.NET Web 应用程序的宿主。HTTPApplication 对象:
1.读取机器级和应用程序级的配置文件。
2.通过一个或多个 HTTPModule 实例传递请求。每个 HTTPModule 提供一种服务,例如会话维护、身份验证,或配置文件维护。这些模块将请求传递回 HTTPApplication。
3.根据谓词和路径将请求传递给 HTTPHandler。谓词指请求中使用的 HTTP 谓词(GET、POST、FTP,等等),而路径指应用程序中的 URL。根据处理程序的配置方式,该请求可能作为一个 ASP.NET 页(System.Web.UI.Page 为 IHTTPHandler 的一种实现)加以处理,或者该请求可能触发另一个操作,例如批编译所有的 Web 页(precomiplation.asd 触发 PrecompHandler)。
在 ASP.NET 2.0 中,该模型没有变化,但是,添加了几种新模块和处理程序以提供其他的服务。与 ASP.NET 1.x 一样,您可以扩展、替换或重新配置任何模块或处理程序类,以提供自己的自定义功能。
新模块
显然,已经添加了新 HTTPModules 以支持 ASP.NET 2.0 中提供的新服务。具体地说,具有默认模块设置的 ASP.NET 应用程序将包括为以下目的而添加的新模块:
- SessionID — 会话识别机制已经从 ASP.NET 1.x 会话模块分离,以提供对 cookie、URL 重写以及会话 ID 生成的其他形式的更多控制。
- 角色管理 — 添加的这种新模块用于提供基于角色的服务,以支持新用户识别机制。该模块有助于将 ASP.NET 应用程序和内置在 .NET 框架中基于角色的安全性结合起来。
- 匿名识别 — 新的个性化功能支持匿名用户。该模块有助于跟踪匿名用户可以访问的功能,以及跟踪在请求之间维护这些功能的方式。
- 配置文件 — 该配置文件模块连接新的配置文件服务,帮助为用户提供特定的持久数据存储。
除了这些新模块,一些旧模块的行为也进行了更改:例如,输出缓存模块现在支持新的缓存技术,这将在本白皮书的稍后部分说明。
新处理程序
除了这些新模块,ASP.NET 2.0 还引进了新的处理程序来支持应用程序配置工具以及其他的新功能,例如,批编译请求。这些新处理程序中最重要的一点是包括处理 Web 站点管理请求的“.axd”系列。这些处理程序启动内部的管理工具,这些管理工具允许开发人员配置 ASP.NET 用户和其他设置。管理处理程序包括:
- Web 管理 — WebAdminHandler 是管理 Web 站点的主页。该处理程序为管理 ASP.NET 2.0 Web 应用程序提供了起点。
- 跟踪 — ASP.NET 1.xTraceHandler 已进行了改进,它是 ASP.NET 1.x 中唯一的“axd”处理程序。
- Web 资源 — 由于有了新的管理工具和 WebResourcesHandler,现在可以在部署后配置 Web 资源。
- 缓存图像 — CachedImageServiceHandler 支持缓存图形组件。
- 计数器 — SiteCountersHandler 使用页面计数器模块为 ASP.NET 2.0 应用程序提供访问统计信息。
- 预编译 — 正如先前提到的一样,可以使用 PrecompHandler 在一个 ASP.NET 应用程序中批编译所有的 ASPX 页。
- Web 部件导出 — WebPartExportHandler 支持存储和传输 Web 部件布局。Web 部件是一种新机制,用于个性化门户样式的 Web 应用程序的外观和内容。
- 与以前一样,HTTPForbiddenHandler 连接到不应该返回的任何文件类型。在 ASP.NET 2.0 中,禁止的文件类型列表已扩展为包括母版页、外观文件和其他的开发人员新组件。
第四部分是缓存技术的改进
1. 提供了数据库依赖缓存技术:SqlCacheDependency
2. 提供了缓存后替换等新的技术:<asp:substitution>