与 COM 有关的变化 随着 .NET 框架和 asp .NET 的诞生,COM 实际上没有发生任何变化。但这并不表示在 ASP .NET 中使用 COM 对象时不必担心和考虑他们的行为。有一些基本情况,您必须了解。
线程模式的变化 ASP .NET 线程模式是多线程单元 (MTA)。这就意味着,对于目前使用的为单线程单元 (STA) 创建的组件,如果不采取额外的措施,将不能在 ASP .NET 中可靠地执行或运行。其中包括但不限于使用 Visual Basic 6.0 及其更低版本创建的所有 COM 组件。
ASPCOMPAT 属性 您将很高兴听到这样一个消息:仍然可以使用这些 STA 组件,而不需要更改任何代码。您需要做的工作只是在 ASP .NET 网页的 <%@Page> 标记中包含兼容性属性 aspcompat=true,如 <%@Page aspcompat=true Language=VB%>。使用此属性将强制网页以 STA 模式执行,从而确保您的组件可以继续正确运行。如果试图使用 STA 组件但没有指定此标记,运行时将会发生异常情况。
将此属性的值设置为 true 时,将允许网页调用 COM+ 1.0 组件,该组件需要访问非管理的 ASP 内置对象。可以通过 ObjectContext 对象进行访问。
如果将此标记的值设为 true,性能会稍微有些下降。建议只在确实需要时才这样做。
早期绑定与后期绑定 在 ASP 中,对 COM 对象的所有调用都是通过 IDispatch 接口进行的。这种行为被称为“后期绑定”,因为对实际对象的调用是在运行时通过 IDispatch 间接处理的。在 ASP .NET 中,只要您愿意,可以继续以这种方式调用您的组件。
Dim Obj As Object Obj = Server.CreateObject("PRogID") Obj.MyMethodCall
仍然可以使用这种方式访问您的组件,但这不是首选方式。现在,在 ASP .NET 中,您可以利用早期绑定直接创建对象,如下所示:
Dim Obj As New MyObject MyObject.MyMethodCall()
使用早期绑定,可以通过类型安全的方式与组件交互。为了在 COM 组件中使用早期绑定,您需要像在 Visual Basic 6.0 项目中添加 COM 引用一样,在项目中添加一个引用。假设您正在使用 Visual Studio .NET,将在 COM 组件之上后台创建一个管理的代理对象,给您的感觉就好像是直接在处理一个 .NET 组件,而不是 COM 组件。
现在,您可能会担心性能问题。由于代理对象而引入了一个额外的层,所以使用 COM 协同操作时确实会存在一些问题。但是,大多数情况下,应该不会遇到什么问题,因为进行协同操作的实际 CPU 指令数仍然远远小于间接 IDispatch 调用的要求。您所得到的将远远超出您所失去的。当然,理想情况是使用最新创建的管理对象,但我们知道,由于我们在 COM 组件上的投入所限,并不总是能够立即做到这一点。
应用程序配置的变化 在 ASP 中,所有 Web 应用程序配置信息都存储在系统注册表和 IIS 配置数据库中。由于服务器上经常未安装适当的管理工具,使得查看或修改设置变得非常困难。ASP .NET 引入了一整套全新的配置模型,这套模型以简单的、易读的 xml 文件为基础。每个 ASP .NET 应用程序都有自己的 Web.Config 文件,该文件位于主应用程序目录中。可以通过此文件控制 Web 应用程序的自定义配置、行为和安全性。
ASP 和 ASP .NET 之间的共享状态 需要考虑的另外一个重要问题是,虽然应用程序可以同时包含 ASP 和 ASP .NET 网页,但您无法共享固有 Session 或 Application 对象中存储的状态变量。可能需要将这些信息复制到这两个系统中或提出其它自定义解决方案,才能完全迁移您的应用程序。最好的情况是您未使用 Session 和 Application 对象。另一方面,如果您大量使用了这些对象,您需要一直小心谨慎,或许可以提出某种自定义的短期解决方案来共享状态。
与安全性有关的变化 安全性是需要特别注意的另一个重要问题。下面简要介绍了 ASP .NET 安全性系统。有关安全性问题更完整的研究,请参见 ASP .NET 安全性文档。
ASP .NET 安全性主要受 web.config 文件中安全性部分的设置控制。ASP .NET 与 IIS 协同工作,为您的应用程序提供完善的完全性模型。IIS 安全性设置是实际携带并应用于 ASP .NET 应用程序的少数几个应用程序设置,其携带和应用方式与在 ASP .NET 中相似。当然,在很多方面都得到了改进。
身份验证 对于身份验证,ASP .NET 支持表 5 中所示的选项。
表 5:ASP .NET 身份验证选项
类型 说明 Windows ASP .NET 使用 Windows 身份验证。 Forms 基于 Cookie 的自定义登录表单。 Passport 非 Microsoft 提供的 Passport Service。 None 不执行身份验证。
除新增加的 Passport 身份验证选项之外,其它选项都与 ASP 中的选项相同。例如,下列配置对应用程序启用基于 Windows 的身份验证。
模拟 做为刷新程序,模拟是指这样一个过程:对象以它所代表的实体的标识执行代码。在 ASP 中,模拟允许您的代码代表通过身份验证的用户运行。或者,用户也可以通过特定标识匿名运行。默认情况下,ASP .NET 不会针对每个请求进行模拟。这一点与 ASP 不同。如果您依赖于这种功能,则需要在 web.config 文件中启用它,如下所示:
总结 正如我们已经了解的,在向 ASP .NET 迁移应用程序之前,有许多问题需要考虑。我在此文中归纳了迁移前后会发生的大多数变化,这应该能使您的迁移过程变得相对简单一些。
如果您拥有一个大型站点,完成此进程之后,您可能会对遇到并修正了如此多的死代码、无效代码以及所有 Bug 而惊奇不已。另外,通常您还可以充分利用 ASP .NET 和 .NET 平台中大量强大的新增功能。
Jim Kieley 是 Microsoft Consulting Services 的高级顾问。从 .NET 发展初期,Jim 就一直与 Visual Studio 组密切合作,而且他还是早期创建 ASP .NET 和 .NET 框架应用程序的用户之一。您可以通过下列电子邮件地址与 Jim 联系:jkieley@microsoft.com