ASP.NET 2.0的内部变化

完整的内容请参考下面微软官方的文章

http://www.microsoft.com/china/msdn/library/webservices/asp.net/dnvs05Internals.mspx?mfr=true

有几个有意思的地方

第一部分是编译模型不一样了

1. ASP.NET 2.0的编译模型不一样了。它通过局部类(Partial)的方式,真正把页面文件(aspx)和代码隐藏文件(aspx.cs)编译成一个类型,而不是以前那样有两个不同的类型。

2. 批编译的机制

image

3. 完整的运行时编译(\app_code 目录)

在目前描述的所有三种编译方法中,在部署前必须要编译所有的代码文件(代码隐藏类和支持类)。在 ASP.NET 2.0 中,您有代码目录。

\app_code 目录是一个保存未编译类的特殊目录。在运行时,ASP.NET 运行库将该目录中的内容编译到一个程序集中,应用程序中的 ASPX 页自动引用该程序集。换句话说,通过使用代码目录,可以避免为支持代码创建和引用单独的程序集。代码目录的优点在于,不用完整编译项目就可以部署,因此减少了不匹配的可能。缺点是,有可能在服务器上公开未编译的代码。

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

 

总结:因为批编译是会增加应用程序启动的时间的,而运行时编译除了增加运行时编译器工作量之外,还有代码安全风险。所以其实在ASP.NET 2.0中,还是首选:部署前预先编译。

第二部分是页面模型不一样了

1. 新增加了很多事件

表 1. 页面生命周期方法
方法 活动

Constructor

Always

Construct

Always

TestDeviceFilter

Always

AddParsedSubObject

Always

DeterminePostBackMode

Always

OnPreInit

Always

LoadPersonalizationData

Always

InitializeThemes:这里存疑,经查证并没有事件                              

Always

OnInit

Always

ApplyControlSkin

Always

ApplyPersonalization

Always

OnInitComplete

Always

LoadPageStateFromPersistenceMedium

PostBack

LoadControlState

PostBack

LoadViewState

PostBack

ProcessPostData1

PostBack

OnPreLoad

Always

OnLoad

Always

ProcessPostData2

PostBack

RaiseChangedEvents

PostBack

RaisePostBackEvent

PostBack

OnLoadComplete

Always

OnPreRender

Always

OnPreRenderComplete

Always

SavePersonalizationData

Always

SaveControlState

Always

SaveViewState

Always

SavePageStateToPersistenceMedium

Always

Render

Always

OnUnload

Always

2. 可以跨页提交

有的朋友一听到这个就很兴奋,其实也没有什么大惊小怪的。而且你实际上用到此特性的几率是很小的。

注意,不可能像下面这样写。就是说你不能去让runat=server的form自动提交到某个action。这是不允许的

image

如果这样做,你就会遇到一个类似下面的错误

image

这真是一个让人懊恼的错误提示,因为你根本不知道发生了什么事情。

要实现这样的需求,你可以通过在Button上面设置一个特殊的属性:PostBackUrl。

image

然后,整个世界就清净了。

果然是这样吗?其实不然,如果是这样提交的话,我们在WebForm1.aspx中如何得到目前页面的一些窗体域的值呢?或者说,WebForm1.aspx在加载的时候,又怎么知道自己是怎么被加载过来的呢?也就是说自己的前一页是什么?我们现在的需求是,在WebForm1.aspx中能不能读到下面的文本框(UserName)的值呢?

image

其实仍然是不难的。我们可以通过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

第三部分是新的管道模型

image

通过开发自定义的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.PageIHTTPHandler 的一种实现)加以处理,或者该请求可能触发另一个操作,例如批编译所有的 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>

原文地址:https://www.cnblogs.com/chenxizhang/p/1444383.html