原 ASP.NET 1.x 代码
文件(位于 WebAppRootFolder 下)
代码
Control1.ascx
inherits="Control1"
- Control1.ascx.cs
class Control1 :System.Web.UI.Page {
public void foo() { some code }}
Code1.cs
Control1 c = (Control1)LoadControl(""/Control1.ascx");
更改代码以使用引用指令:
ASP.NET 2.0 版本
文件(位于 WebAppRootFolder 下)
代码
Control1.ascx
inherits="d_Control1"
- Control1.ascx.cs
class d_Control1 :Control1 {
override public void foo() { some code }}
App_Code\Code1.cs
Control1 c = (Control1)LoadControl(""/Control1.ascx");
App_Code\Stub_Control1.cs
abstract class Control1 :System.Web.UI.Page {
abstract public void foo(); }
由于抽象集类现在位于 App_Code 目录下,因此它将允许独立类文件和 CB 文件在编译过程中查找类(在本示例中名为 Control1)。但是,在运行时,独立类文件将使用后期绑定来加载原始类(在本示例中重命名为 d_Control1)。请注意,在 Visual Studio 2005 的最终版本中,转换向导将自动为您创建此代码。
代码分离文件中的附加类型
在 ASP.NET 1.x 中,通过将类型(例如,结构、枚举、界面和模块等)存储在一个用于 Web 窗体或用户控件的代码分离文件中,可以在不同的页面之间共享这些类型。
在 ASP.NET 2.0 中,由于 Web 窗体和用户控件被编译到各自的程序集中,因此此模式被破坏,无法再发现附加类型。
如何修复
当转换向导转换完应用程序之后,只将任一非私有附加类型移到它在 App_Code 目录下专用的独立代码文件中。您还需要将该类型的访问修改符更改为 public,因为该类型必须在多个程序集中工作。共享类型将自动编译,并且可通过 Web 应用程序发现。
请注意,在 Visual Studio 2005 的最终版本中,转换向导将自动执行此操作。生成的独立文件将位于 Migrated 子目录下,该文件的文件名将基于在其中找到附加类型的文件以及所找到的类型的名称。您可以根据需要随意重命名此文件,只需将其保留在 App_Code 目录下即可。
同一位置处的多个 Web 项目
如果在同一解决方案中有多个 Web 项目共享同一个目录位置,则 Visual Studio 2005 将把在该位置找到的所有文件都视为单个 Web 应用程序的一部分。尽管向导会自动将所有程序集引用移到 web.config 文件中,您仍然可能遇到下列问题:
由项目合并导致的命名冲突。
如果一个 Web 项目引用另一个 Web 项目,并且两个项目合并到一起,则会产生引用问题。
如何修复
在转换项目之前将它们分隔开,即,将它们放在各自单独的目录位置。
模糊引用和命名冲突
.net Framework 2.0 添加了许多新的命名空间和类。其中一些有可能导致与 ASP.NET 1.x 应用程序的冲突。例如,新的个性化功能引入了名为 Profile、Membership 和 MembershipUser 的类。Profile 名称对于要跟踪用户信息的开发人员来说是特别常用的。因此,如果应用程序中具有 Profile 类,并且您尝试使用任一新增个性化功能,则可能会遇到关于模糊类引用的编译器警告。
如何修复
针对命名冲突进行事先计划是相当困难的。您需要快速浏览新的 ASP.NET 类。如果看到可能会与应用程序中的某些内容冲突的任何名称,则需要考虑使用明确命名。例如,使用 System.Web.Security.Membership 而不导入/使用 System.Web.Security,然后使用 Membership 类。
设计视图问题
visual Studio 2005 中内置的新增 Visual Web Designer 能够比 Visual Studio .NET 2003 得到更加严格的 HTML。如果 .aspx 页面包含不匹配的标记或格式不佳的 HTML,那么设计器将不允许您切换到 Visual Studio 2005 内的设计视图,而只能切换到代码视图,直到修复了问题为止。发生此问题是由于 Visual Studio 2005 内置的新增源代码保存和验证函数。
如何修复
避免此问题的唯一方法就是确保 .aspx 页面中的标记格式正确。如果在转换后从代码视图切换到设计视图时遇到了问题,那么几乎可以肯定是标记错误问题。
多次调用事件处理程序
由于转换向导合并代码分离文件与 .aspx 页面的方式,您可能会遇到自动调用的事件被两次调用(例如,页面加载)的情况。如果事件绑定代码不位于代码分离文件的 InitializeComponent 方法中,则会发生这种情况。转换向导只有在绑定位于 InitalizeComponent 方法中的情况下才能够删除重复的绑定。
您可能很难注意到这个错误,因为在大多数情况下,第二次事件激发不会带来危害。但是,如果您确实发现某个自动调用事件多次发生,则应检查转换后的代码分离文件,以查看处理程序是否两次被绑定到事件。如果是这样,则必须手动删除第二个绑定。
如何修复
通过浏览现有代码,并确保所有事件绑定都包含在代码分离文件的 InitialzeComponent 函数中,或者通过在页面中设置 AutoEventWireUp=False,即可完全避免此问题。
错误列表错误“错误: 无法分析文件名”
当转换报告中通知您不能分析文件时,您可能会看到这条更加模糊的错误消息。产生这种错误的实际原因有很多,其中包括:
页面格式不正确。如果项目中含有格式不正确的 .aspx 页面,则向导可能无法读取该页面,也无法将其识别为 .aspx 页面。
未找到“codebehind”属性或“src”属性。如果 .aspx 页面不包含这两个属性中的任何一个,则向导将找不到匹配的代码分离文件,并且不能转换该页面。如果普通的 HTML 页面发生这种情况,则可以将其忽略。如果应用程序包含使用 .aspx 扩展名的纯 HTML 页面,那么您会经常遇到此错误。
未找到代码分离文件。如果 .aspx 页面应含有代码分离文件,但在项目目录中找不到该文件,则可能会看到此错误。在这种特定情况下,您还会看到另一条错误消息:“未找到代码分离文件的文件名”。这两个错误都与同一个页面相关。第一个错误指示无法处理 .aspx 部分,第二个错误指示未找到代码分离文件。
文件在项目文件(.csproj、.vbproj)中列出了,但不在指定的目录下。如果您添加、删除、重命名或移动 ASP.NET 项目文件内容,ASP.NET 项目文件经常会过期。如果您确定列出的文件不应是项目的一部分,则可以忽略此错误。
如何修复
为了避免这些问题,请在开始转换之前确保项目完整,并且项目中列出的所有文件都在指定的目录下。
移到 App_Code 目录下的代码分离文件
运行转换向导之后,您可能会发现某些代码分离文件(例如,*.aspx.cs 或 *.ascx.vb)被移到 App_Code 目录下。这表明代码分离文件的内容页面含有格式不正确的 Codebehind 指令,并且没有进行正确设置。也就是说,转换向导不能确定该代码分离文件是否实际绑定到某个特定的 .aspx 页面。
转换向导会自动将所有独立类文件(例如,*.cs 或 *.vb)移到 App_Code 目录下。如果有格式不正确的 Codebehind 指令,那么代码分离文件将被视为独立类文件,并且被移到 App_Code 目录下。
请注意,web 服务文件(例如,*.asmx 和 *.asmx.cs)与普通的内容页面及其代码分离页面不同。Web 服务文件的代码分离页面预计位于 App_Code 目录下,因此如果在此发现一个代码分离页面,它并不是错误。
如何修复
在转换之前,确保在所有内容页面中正确设置了 Codebehind 指令,即可避免此问题。
转换之后,将代码分离文件与相关联的内容页面移到同一目录下,并更正内容页面的 Codefile 指令(在 ASP.NET 2.0 中已重命名),以便指向该代码分离文件。
不再排除以前排除的文件
在 Visual Studio .NET 2003 中,您必须明确决定是否在 Web 项目中包含各个文件。如果未明确将某个文件列为包含文件,就会从项目中排除该文件。您还可以将代码文件的生成操作设置为“无”,从而停止生成该代码文件。此信息将存储在项目文件中。
在 Visual Studio 2005 中,在 Web 应用程序目录下找到的所有文件都被作为 Web 项目的一部分而隐式包含。由于没有项目文件,因此无法明确列出要排除的文件,也无法阻止将它们内置到项目中。这样一来,Web 项目中现在就可能包含额外的文件。编译器可能会根据文件的扩展名尝试编译文件,这将导致应用程序中产生冲突。
如果将文件的生成操作设置为“无”,则转换向导将不转换这些文件。由于这些文件被视为排除文件,因此转换向导无法确定这些文件是否必要。由于这个原因,向导将在转换报告中记录一条警告,指出没有转换项目结构中的某些文件。
如何修复
如果要转换排除文件,应在转换之前将该排除文件明确包含在 Web 项目中,并确保其生成操作没有被设置为“无”。
转换之后,您可以从项目中删除任何不想要的、以前排除的文件。还可以用安全的扩展名(例如“.exclude”)对它们进行重命名,以便有效地从 Web 应用程序中删除它们。重命名这些文件后,它们仍然是 Web 项目的一部分,但不能进行编译。
visual Studio 2005 的最终版本将包含一个使您可以使用重命名机制排除和包含文件的上下文菜单项。最终版本还将做出一些更改,这些更改将阻止发布站点和命令行生成引擎 (MSBuild) 发布已排除的文件。ASP.NET 还将被配置为不使用 .exclude 扩展名提供文件。
部分转换的解决方案
在 ASP.NET 1.x 和 2.0 中,都有可能具有包含 Web 项目和客户端项目(例如 C# 类库或 Visual Basic 类库,或 Windows 应用程序)的解决方案。
如果您正在使用某个 Express 产品,例如 Visual Web Developer (VWD) 或 Visual Basic Express Edition,则只能在与该 Express 产品相关的解决方案中转换项目。例如,如果您正在使用 VWD 并打开一个含有 Web 项目和 Visual Basic 类库项目的解决方案,则只有 Web 项目会被转换,从而给您留下了一个部分转换的解决方案。
如何修复
您应使用 Visual Studio 2005 的 Standard、Professional 或 Team System 版本来转换包含多种混合项目类型的解决方案。
如果做不到这一点(您只有 Express Edition),则应创建一个仅包含该项目类型的新解决方案。
更新服务器
在将已转换的 ASP.NET 2.0 Web 应用程序部署到生产服务器之前,需要将 .NET Framework 2.0 部署到目标服务器。在本文的这一部分,我们将着眼于安装 .NET Framework 2.0 的步骤,以及一旦部署了该框架,如何将应用程序配置为使用该框架。
部署 .NET Framework 2.0
使用 ASP.NET 2.0 的第一步是部署已更新的 .NET Framework。由于 .NET Framework 的设计方式,您无需破坏当前安装的 1.0 或 1.1 框架就可以部署 2.0 框架。
获取框架
目前,您可以
直接从 Microsoft
获取 NET Framework 2.0 安装程序。如果您是订阅了 MSDN,还可以从最近的 MSDN DVD 上找到各个版本。安装程序的大小为 22.4 MB。
请注意,该框架安装程序仅用于安装该框架,而不包含 Visual Studio 2005。您将使用此包在服务器上安装新的框架。如果需要在开发人员的计算机上安装新框架,则应注意安装 Visual Studio 2005,其中也包含 .NET Framework 2.0。
Go-Live 许可证
如果您计划在生产站点上使用 ASP.NET 2.0,则需要获取 Microsoft Visual Studio 2005 Beta 2 Go-Live 许可证。此许可证对使用规定进行了补充,使您可以将使用 Visual Studio 2005 生成的应用程序部署到生产中。请转到Visual Studio 2005 Beta 2 Go-Live License 页面
,以阅读许可证条款、查看所包含产品的列表、阅读了解许可证限制,以及使用 Microsoft Passport 帐户签署 Go-Live 许可证。
安装框架
下载了框架之后,您需要将其安装到目标服务器上。请记住,.net Framework 2.0 与 1.1 框架完全兼容。此外,安装新框架不会破坏任何现有的应用程序,因为它们将继续在 ASP.NET 1.1 框架上运行,直到您专门将它们配置为在 ASP.NET 2.0 上运行为止。
使用 IIS MMC 管理单元配置 ASP.NET 2.0
一旦您在服务器上安装了该框架并使用 IIS 设置了基本扩展之后,下一组选择将涉及为每个 ASP.NET 应用程序指定特定的 .NET Framework 版本。默认情况下,1.x 应用程序将继续使用 1.x 框架。但是您必须将转换过的应用程序配置为使用 2.0 框架。
asp.net 2.0 将为 IIS 部署一个特殊的 Microsoft 管理控制台 (MMC) 管理单元,使您可以确定哪些应用程序应使用哪些版本的 .NET Framework。
图 6:asp.net 应用程序的 MMC 显示
mmc ASP.NET 选项卡使您可以选择您的应用程序使用哪个版本的 ASP.NET 并显示 Web.config 的位置。
除了管理框架版本之外,该控制台还具有一个“编辑配置”按钮,使您不必直接操作 Web.config XML 文件就可以直观地编辑大部分 Web.config 或 machine.config 设置。如果您是管理员,将会发现此 MMC 管理单元提供了一个用于在单个服务器上配置和管理多个 ASP.NET 应用程序的非常有用的工具。
总结
将应用程序从 ASP.NET 1.x 转换到 ASP.NET 2.0 通常是一个顺利的过程。但是您必须确保正确地配置了开发和部署环境。您还必须评估转换报告,以确保转换后的应用程序能够正常运行。还可能需要提前检查应用程序,并事先进行计划以避免已知的转换问题。
即将发布的 .NET Framework 2.0 最终版本
rtm 版本的转换向导所遵循的基本过程与本文所介绍的过程相同。但某些特定细节可能会有所不同。例如,通过自动实施必要的更改,RTM 向导可能能够更好地避免当前已知的某些问题。