COM+ 提供了大量可由 Active Server Pages (ASP) 应用程序使用的服务,并且它还提供了一种可用于 ASP 页面的服务 -- 事务处理。以下简要说明了如何为 ASP 应用程序配置各项服务。有关如何配置 COM+ 中的这些服务,不论是通过编程还是通过使用“组件服务管理器”,请参阅“COM+ 软件开发工具包 (SDK)”中的相关信息或在线查询 COM+ (Component Services)。
因为使用 IIS 管理器只能启用并排集合,下面提供了可在 ASP 应用程序上启用各项服务的示例代码。
本主题包括下列信息:
ASP 现在能够在多线程单元 (MTA) 中运行其全部线程。如果 COM 组件主要是自由线程或双线程组件,则将 ASP 线程作为 MTA 运行可显著改善性能。
要使 ASP 应用程序能够在 MTA 中运行,您可以在应用程序级别使用配置数据库设置:
要点 当您将 ASP 应用程序的运行环境从 STA 切换到 MTA(或从 MTA 切换到 STA)时,则模拟令牌将会过时。这将使应用程序在无模拟的情况下运行,让其用可能允许访问其他资源的进程的标识有效地运行。如果您必须切换线程模型,请在进行更改之前,先禁用该应用程序并卸载它。
下面的示例将默认网站应用程序 (W3SVC/1/ROOT) 设置为在 MTA 中执行:
On Error Resume Next
set providerObj = GetObject("winmgmts://MyMachine/root/MicrosoftIISv2")
' 获取对名为“默认网站”的 ASP 应用程序的引用
set IIsWebVirtualDirSettingObj = providerObj.get("IIsWebVirtualDirSetting ='W3SVC/1/ROOT'")
WScript.Echo "Before: AspExecuteInMTA = " & IIsWebVirtualDirSettingObj.AspExecuteInMTA
' 将该 ASP 应用程序设置为在 MTA 中执行
IIsWebVirtualDirSettingObj.AspExecuteInMTA = 1
IIsWebVirtualDirSettingObj.Put_()
WScript.Echo "After: AspExecuteInMTA = " & IIsWebVirtualDirSettingObj.AspExecuteInMTA
并排 (SxS) 集合允许 ASP 应用程序指定要使用哪个版本的系统 DLL 或传统 COM 组件,例如 MDAC、MFS、MSVCRT、MSXML 等。例如,如果您的 ASP 应用程序依赖 MSXML 2.0 版,则可以确保即使是在向服务器应用了 Service Pack 之后,该应用程序仍使用 MSXML 2.0 版。任何新版本的 MSXML 仍安装在计算机上,但是 2.0 版仍保留且由应用程序使用。配置 SxS 集合要求知道 DLL 的路径,且 COM+ 清单文件存在于每个需要使用 DLL 的虚拟目录中。COM+ 清单是包含有关 DLL 安装位置信息的 XML 文件。IIS 不验证清单是否存在。清单的外观类似于下面的文件摘录:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity publicKeyToken="75e377300ab7b886" type="win32" name="Test4Dir" version="1.0.0.0" processorArchitecture="x86"/>
<file name="DirComp.dll" hash="35ca6f27b11ed948ac6e50b75566355f0991d5d9" hashalg="SHA1">
<comClass clsid="{6C6CC20E-0F85-49C0-A14D-D09102BD7CDC}" progid="DirComp.PathInfo" threadingModel="apartment"/>
<typelib tlbid="{AA56D6B8-9ADB-415D-9E10-16DD68447319}" version="1.0" helpdir=""/>
</file>
</assembly>
可以在 IIS 端以编程方式或者通过使用 IIS 管理器来启用并排集合。
在 IIS 端使用 IIS 管理器启用并排集合
要以编程方式启用并排集合,请设置
要点 即使该功能在应用程序级别进行配置,任何一个应用程序池中都只能使用一个版本的系统 DLL。例如,如果应用程序 App1 使用 MDAC 2.5 版,应用程序 App2 使用 MDAC 2.4 版,则 App1 和 App2 不应位于同一个应用程序池中。如果它们位于同一个应用程序池中,则首先加载的应用程序加载与之相对应的 MDAC 版本,在卸载这些应用程序之前,强制其他应用程序使用该版本。
下面的示例在默认网站应用程序 (W3SVC/1/ROOT) 上启用并排集合。请注意,在只设置了 AspEnableTracker 属性之后,
On Error Resume Next
set providerObj = GetObject("winmgmts://MyMachine/root/MicrosoftIISv2")
' 获取对名为“默认网站”的 ASP 应用程序的引用
set IIsWebVirtualDirSettingObj = providerObj.get("IIsWebVirtualDirSetting ='W3SVC/1/ROOT'")
WScript.Echo "Before: AspEnableSxs = " & IIsWebVirtualDirSettingObj.AspEnableSxs
WScript.Echo " AspSxsName = " & IIsWebVirtualDirSettingObj.AspSxsName
WScript.Echo " AspAppServiceFlags = " & IIsWebVirtualDirSettingObj.AspAppServiceFlags
' 设置 ASP 应用程序以启用 COM+ 并排集合
IIsWebVirtualDirSettingObj.AspEnableSxs = 1
' 设置 AspSxsName 属性
IIsWebVirtualDirSettingObj.AspSxsName = "VersionInfo"
' 将值保存到 IIS 配置数据库中
IIsWebVirtualDirSettingObj.Put_()
' 再次获得引用以刷新 AspAppServiceFlags 属性。
set IIsWebVirtualDirSettingObj = Nothing
set IIsWebVirtualDirSettingObj = providerObj.get("IIsWebVirtualDirSetting ='W3SVC/1/ROOT'")
WScript.Echo "After: AspEnableSxs = " & IIsWebVirtualDirSettingObj.AspEnableSxs
WScript.Echo " AspSxsName = " & IIsWebVirtualDirSettingObj.AspSxsName
WScript.Echo " AspAppServiceFlags = " & IIsWebVirtualDirSettingObj.AspAppServiceFlags
COM+ 分区可用于将 Web 应用程序隔离到它们各自的 COM+ 分区中。这对于防止一个 Web 应用程序访问另一个 Web 应用程序的专用 COM+ 应用程序、配置信息和数据非常有用。COM+ 分区可拥有自定义 COM 组件的不同版本。例如,如果为两个都在其 Web 应用程序中使用 COM+ 的竞争公司宿主网站,则可以使用 COM+ 分区来确保一个公司的 Web 应用程序不能访问另一个公司的 Web 应用程序中的 COM+ 组件。如果其中某个公司要求更改双方都使用的 COM+ 应用程序的某些功能,那么可以在链接到它们的 Web 应用程序的分区中隔离该 COM+ 应用程序的新版本。
要在 IIS 端启用 COM+ 分区,请在应用程序级别设置
要点 即使该功能可在应用程序级别进行配置,任何一个应用程序池中都只能使用一个版本的 COM+ 组件。例如,如果应用程序 App1 使用名为 Shop.dll 的 1.0 版的自定义 COM+ 应用程序,应用程序 App2 使用 2.0 版的 Shop.dll,则 App1 和 App2 不应位于同一个应用程序池中。如果它们位于同一个应用程序池中,则首先加载的应用程序加载与之对应的 Shop.dll 版本,在卸载这些应用程序之前,其他应用程序只能被迫使用该版本。
下面的示例在“默认网站”应用程序 (W3SVC/1/ROOT) 上启用分区。请注意,在只设置了 AspEnableTracker 属性之后,
On Error Resume Next
set providerObj = GetObject("winmgmts://MyMachine/root/MicrosoftIISv2")
' 获取对名为“默认网站”的 ASP 应用程序的引用
set IIsWebVirtualDirSettingObj = providerObj.get("IIsWebVirtualDirSetting ='W3SVC/1/ROOT'")
WScript.Echo "Before: AspUsePartition = " & IIsWebVirtualDirSettingObj.AspUsePartition
WScript.Echo " AspPartitionID = " & IIsWebVirtualDirSettingObj.AspPartitionID
WScript.Echo " AspAppServiceFlags = " & IIsWebVirtualDirSettingObj.AspAppServiceFlags
' 设置 ASP 应用程序以启用 COM+ 分区
IIsWebVirtualDirSettingObj.AspUsePartition = 1
' 将 AspPartitionID 属性设置为在“组件服务管理器”中配置的 GUID
' 当您创建 COM+ 分区时
IIsWebVirtualDirSettingObj.AspPartitionID = "{00000000-0000-0000-0000-000000000000}"
' 将值保存到 IIS 配置数据库中
IIsWebVirtualDirSettingObj.Put_()
' 再次获得引用以刷新 AspAppServiceFlags 属性。
set IIsWebVirtualDirSettingObj = Nothing
set IIsWebVirtualDirSettingObj = providerObj.get("IIsWebVirtualDirSetting ='W3SVC/1/ROOT'")
WScript.Echo "After: AspUsePartition = " & IIsWebVirtualDirSettingObj.AspUsePartition
WScript.Echo " AspPartitionID = " & IIsWebVirtualDirSettingObj.AspPartitionID
WScript.Echo " AspAppServiceFlags = " & IIsWebVirtualDirSettingObj.AspAppServiceFlags
COM+ 跟踪程序允许管理员或开发人员调试 ASP 应用程序。例如,如果 Web 应用程序在服务器上产生问题,则可以启用 COM+ 跟踪程序来确定何时加载 ASP 页、何时加载 COM 组件以及线程何时离开网页。在调试应用程序之后,可禁用 COM+ 跟踪程序以使应用程序恢复到正常的执行速度。
要在 IIS 端上启用 COM+ 跟踪程序,请在应用程序级别设置
下面的示例在默认网站应用程序 (W3SVC/1/ROOT) 上启用跟踪。请注意,在只设置了 AspEnableTracker 属性之后,
On Error Resume Next
set providerObj = GetObject("winmgmts://MyMachine/root/MicrosoftIISv2")
' 获取对名为“默认网站”的 ASP 应用程序的引用
set IIsWebVirtualDirSettingObj = providerObj.get("IIsWebVirtualDirSetting ='W3SVC/1/ROOT'")
WScript.Echo "Before: AspEnableTracker = " & IIsWebVirtualDirSettingObj.AspEnableTracker
WScript.Echo " AspAppServiceFlags = " & IIsWebVirtualDirSettingObj.AspAppServiceFlags
' 设置 ASP 应用程序以启用 COM+ 跟踪
IIsWebVirtualDirSettingObj.AspEnableTracker = 1
IIsWebVirtualDirSettingObj.Put_()
' 再次获得引用以刷新 AspAppServiceFlags 属性。
set IIsWebVirtualDirSettingObj = Nothing
set IIsWebVirtualDirSettingObj = providerObj.get("IIsWebVirtualDirSetting ='W3SVC/1/ROOT'")
WScript.Echo "After: AspEnableTracker = " & IIsWebVirtualDirSettingObj.AspEnableTracker
WScript.Echo " AspAppServiceFlags = " & IIsWebVirtualDirSettingObj.AspAppServiceFlags