•
没有项目文件。
ASP.NET 1.x 应用程序与 2.0 应用程序之间最明显的差别就是后者没有项目文件(例如 *.vbproj 或 *.csproj)。在 1.x 应用程序中,项目文件包含生成设置、对外部程序集的引用以及项目中的文件列表。而在 2.0 应用程序中,不再需要版本设置和文件列表,因为 Web 项目目录下的所有文件都被视为 Web 项目的一部分。
•
特殊目录。
ASP.NET 1.x 应用程序具有一个必需的目录 (\bin),用于包含程序集。ASP.NET 2.0 应用程序中则定义了一种更大的目录结构。新目录均以前缀“App_”开头,用于存储资源、程序集、源代码和其他组件。使用这种新的目录结构将不再需要项目文件,并且还可以选用某些新的部署方法。
•
代码分离模式。
在 ASP.NET 1.x 中,代码分离模式使内容(例如 foo.aspx)与代码(例如 foo.aspx.vb)分离。内容页面从代码分离页面继承而来,代码分离页面包含用户和设计器生成的代码。ASP.NET 2.0 通过使用局部类来增强代码分离模式,它允许一个类跨越多个文件。在新的代码分离模式中,内容页面从编译的类继承而来,它由相应的代码分离页面以及自动生成的存根文件组成,存根文件用于为内容页面中使用的控件定义字段声明。此项更改使自动生成的代码与用户的代码分离,并且使代码分离页面显著变小且更加简洁。局部类结构还降低了由于编辑设计器生成的代码而不小心破坏页面的风险。
•
编译模式(一个程序集对多个程序集)。
在 ASP.NET 1.x 中,所有的内容页面、代码分离页面和支持代码都预先编译到具有固定名称的单个程序集中。在 ASP.NET 2.0 中,则即时(默认)创建文件名各不相同的多个程序集。例如,每个 ASPX 页面(由内容页面、代码分离页面和隐藏的设计器页面组成)将被编译到各自的程序集中。App_Code 目录会自动把公共源代码编译到它自己的程序集中。这种新的编译模式使 ASP.NET 应用程序的结构发生了一些变化,但大大丰富了部署方式,以及在 Web 服务器上提供 Web 应用程序的方式。
•
部署方式(预编译、完整编译、可更新站点等)。
在 ASP.NET 1.x 中,Web 应用程序是作为一个大型程序集而预编译和部署的。内容页面(例如 *.aspx)不在服务器上编译,但可以在服务器上编辑。借助新的页面编译模式和目录结构,您就可以使用多种不同的配置来部署 ASP.NET 2.0 应用程序。在一种极端的情况下,您可以预编译所有的 ASPX 页面并部署由完全编译好的程序集组成的 Web 应用程序。在这种模式下,您不能在服务器上轻松地更改该应用程序。在另一种极端情况下,您可以在不预编译任何代码的情况下部署应用程序。在这种配置下,您可以直接在服务器上更改该应用程序中的 .aspx 页面、代码分离文件或其他任何代码。当用户请求服务器上的页面时,页面将被动态编译。
重大的改变
对代码分离文件的更改
在 ASP.NET 1.x 中,通常使用 .aspx 页面和代码分离文件将图形组件与编码组件分开。.aspx 页面是从代码分离文件派生而来的。这意味着您必须声明这两类的所有控件,以便正确绑定回调事件。这种继承关系还引发了有关使两类同步的某些问题,尤其是当开发人员对 .aspx 页面进行了更改(例如,添加一个控件)而没有对代码分离文件进行必要的更改也没有重新编译应用程序时。
在 ASP.NET 2.0 中,由于局部类这一概念的出现,代码分离模式已发生了变化。使用 partial 关键字可以将单个类的代码分隔到两个独立的文件中。代码分离文件定义了一个包含用户代码的局部类。设计器还将生成存根文件,其中包含一个局部类,用于定义 .aspx 页面中使用的控件对应的字段声明。编译后,.aspx 页面将从合并的局部类派生而来,并且被编译到它自己的页面程序集中。这种设计降低了由于编辑设计器生成的代码而不小心破坏页面的风险。
对应用程序的更改
转换向导将在下列几个方面对应用程序进行更新:
转换向导将在下列几个方面对应用程序进行更新:
•
将 .aspx 页面中的所有 CodeBehind 属性更改为 CodeFile 属性。
•
更改所有代码分离类定义以执行 partial 关键字。
•
如果在 .aspx 页面上声明了所有控件,则从代码分离文件中删除所有控件声明。
•
(仅限于 C#)将事件挂钩代码从代码分离文件的 InitialzeComponent 函数移到 .aspx 页面中。请注意,此操作不适用于自动调用的事件,包括 Page_Init、Page_Load、Page_DataBind、Page_PreRender、Page_Unload、Page_Error、Page_AbortTransaction 和 Page_CommitTransaction。
独立的代码文件
在 ASP.NET 1.x 中,所有源代码都编译到单个程序集中。此程序集存储在应用程序目录的 /bin 目录下。为了支持新的编译选项,并针对部署提供某些增强功能,ASP.NET 2.0 实际为每个 ASP.NET Web 页面和用户控件创建了单个程序集。此外,还创建了一个单独的程序集用来保存所有独立的代码文件(即,非代码分离的代码文件)。
对应用程序的更改
转换向导将在下列几个方面对应用程序进行更新:
转换向导将在下列几个方面对应用程序进行更新:
•
将所有独立的代码移到 App_Code 目录下。
•
将所有的默认、Friend 和 Internal 范围的声明更改为 Public。需要进行此项更改是因为代码分离文件不再与共享代码位于同一个程序集中。因此,必须更改访问级别以便与新的多程序集结构相匹配。
•
将所有 Type.GetType() 调用更改为 System.Web.Compilation.BuildManager.GetType()。这种新方法可自动识别要访问哪个程序集来查找类的类型。如果您试图在代码分离文件中使用 Type.GetType(),将很可能遇到 TypeLoadException,因为代码分离文件与独立的代码位于不同的程序集中。
资源
由于 ASP.NET 2.0 中的新目录结构,资源文件的位置和存储已发生了变化。尤其是,ASP.NET 2.0 应用程序现在具有一个 App_GlobalResources 目录,专门用于保存资源文件。转换向导将自动把必需的资源文件重新定位到相应的位置。在 ASP.NET 2.0 中,不再需要与 Web 窗体相关联的资源文件,因此将不对其进行修改。
由于 ASP.NET 2.0 中的新目录结构,资源文件的位置和存储已发生了变化。尤其是,ASP.NET 2.0 应用程序现在具有一个 App_GlobalResources 目录,专门用于保存资源文件。转换向导将自动把必需的资源文件重新定位到相应的位置。在 ASP.NET 2.0 中,不再需要与 Web 窗体相关联的资源文件,因此将不对其进行修改。
对应用程序的更改
转换向导通过将所有独立的资源文件移到 App_GlobalResources 目录下,对应用程序进行更新。此目录下的所有文件将内置在单个程序集中。
转换向导通过将所有独立的资源文件移到 App_GlobalResources 目录下,对应用程序进行更新。此目录下的所有文件将内置在单个程序集中。
请注意,必须进行某些其他的代码更改,以便访问资源文件。这些代码更改在“常见转换问题”部分的“资源文件”中进行了概要介绍。
引用
在 ASP.NET 1.x 中,有三种类型的外部程序集引用方式:
在 ASP.NET 1.x 中,有三种类型的外部程序集引用方式:
•
全局程序集缓存 (GAC):Web 应用程序依赖于位于系统的 GAC 中的某个程序集。以这种方式引用的程序集存储在项目文件中,编译器在运行时会将 Web 应用程序链接到 GAC 中的该程序集。
•
项目对项目 (P2P):在转换过程中,如果解决方案中的所有项目同时转换,将保持 P2P 引用方式。
•
本地:Web 应用程序依赖于在 Web 项目的解决方案外创建的某个基于文件的程序集。以这种方式引用的程序集存储在项目文件中,Visual Studio 将把该程序集的一个版本复制到 bin 目录下。如果 CopyLocal 设置为 true,则将用该程序集的最新版本来更新 bin 目录。编译器会将 Web 应用程序链接到 bin 目录下的该程序集。
ASP.NET 2.0 使用 bin 目录存储以 P2P 和本地方式引用的程序集。此目录不仅包含针对应用程序自动生成的程序集,还可以存储应用程序需要引用的任何其他可执行代码。
对应用程序的更改
由于 ASP.NET 2.0 应用程序没有项目文件,因此必须移动对外部程序集的引用。
•
GAC 引用被移到 web.config 文件中。例如:
<system.web>
<compilation>
<assemblies>
<add assembly="EnvDTE, Version=8.0.0.0, Culture=neutral,
PublicKeyToken=B03F5F7F11D50A3A"/>
</assemblies>
</assemblies>
... Other tags
</compilation>
... Other tags
</system.web>
对 GAC 中的程序集的 web.config 引用
•
P2P 引用存储在解决方案文件中。在转换过程中,如果解决方案中的所有项目同时转换,则 P2P 引用将保持为 P2P。
•
在 Visual Studio 2005 的 Beta 2 版中,本地引用的程序集不可更新。在 Visual Studio 2005 的最终版本中,通过添加 Refresh 文件修复了此行为。此文件存储在 bin 目录下,其文件名采用程序集名称加上“.refresh”的方式来生成。Refresh 文件包含指向外部引用的程序集的路径,其存在向编译器指明,如果原始程序集的时间戳时间较晚,则需要刷新此程序集及其依赖的程序集。这与 Visual Studio .NET 2003 中的“复制本地”行为相似。
以 P2P 和本地方式引用的程序集都被复制到 Bin 目录下。
Web 引用
与常规引用不同,Web 引用指向 Web 服务。在 Visual Studio .NET 2003 中,当您在 ASP.NET 1.x 应用程序中创建了 Web 引用后:
1.
就在该应用程序的 Web References 目录下创建了一个目录
2.
就创建了一个引用类,其中包含 Web 服务的 WSDL 中为每个对象定义的代理类。
3.
就创建了一个名为 reference.map 的 discovery 文件,其中包含有关如何创建和更新 Web 引用的信息。
ASP.NET 2.0 更改了此过程以构成新的目录结构以及 Web 服务在 .NET Framework 2.0 中的处理方式的一些更改。
对应用程序的更改
转换向导将在下列几个方面对应用程序进行更新:
•
将所有 Web 引用目录从 Web References 目录移到 App_WebReferences 目录下。
•
在 App_Code 目录下放置 WSDL 文件的一个副本。WSDL 文件的版本提供程序将自动生成 Web 服务代理类,这些代理类已编译,并且可通过任何 Web 页面访问,因为它们存储在 App_Code 目录下。
•
删除由 Visual Studio .NET 2003 生成的代理类。旧的 1.x 代理类不再是必需的,因为这些代理现在可在 App_Code 目录下自动生成。
•
将 discovery 文件的扩展名 .map 更改为 .discomap。
Web 服务
在 ASP.NET 1.x 中,Web 服务 (.asmx) 自动拆分到空白标题页面 (.asmx) 和包含实际方法的代码分离文件中。
对应用程序的更改
转换向导将在下列几个方面对应用程序进行更新:
•
将代码分离类移到 App_Code 目录下,以便使其自动变为可通过应用程序中的任意 ASP.NET 页面访问。
•
更改 .asmx 文件中的 CodeBehind 属性,以便指向新位置。(请注意,代码分离文件不使用局部类,因此继续使用 CodeBehind 属性。)
•
将所有的默认、Friend 和 Internal 范围的声明更改为 Public。
Global.Asax
在任一 ASP.NET 应用程序中,您都可以使用 Global.asax 文件捕获特定的应用程序级事件,包括启动、关闭、会话周期、请求周期和错误消息。此文件与 Web 服务文件十分相似,它具有简单的 shell 标题页面 (.asax) 和代码分离文件。
对应用程序的更改
转换向导将在下列几个方面对应用程序进行更新:
转换向导将在下列几个方面对应用程序进行更新:
•
将代码分离文件移到 App_Code 目录下,以便使其自动变为可通过应用程序中的任意 ASP.NET 页面访问。
•
“Code-behind”属性将从 ASAX 文件的指令中删除。
•
(对于 Visual Basic)向该类文件中添加一条命名空间语句。命名空间由 Web 项目中的根命名空间定义。
数据集
在 ASP.NET 1.x 中,使用内置的向导或 xsd.exe 命令行工具来生成类型化 DataSet 对象。生成的代理对象存储在顶层目录下。而在 ASP.NET 2.0 中,这些 DataSet 对象以不同的方式生成和存储。
对应用程序的更改
转换向导将在下列几个方面对应用程序进行更改:
•
将 .xsd 文件(DataSet 描述符)移到 App_Code 目录下。运行时将自动根据此文件生成类型化数据集。
•
删除旧的代理文件。