【发布时间】:2011-03-31 01:28:09
【问题描述】:
我们使用 Windows 2003 服务器运行各种作业。其中一些作业将应用程序池命令发送到运行 IIS 6 的 Web 服务器(回收、启动、停止)。现在我们有一个运行 IIS 7 的 Windows 2008 Web 服务器,我们想要发送相同的命令。这一切都是使用 C# 完成的。
这是我们用来为 IIS 6 发送命令的代码:
var methodToInvoke = "Stop"; // could be "Stop", "Start", or "Recycle"
var co = new ConnectionOptions
{
Impersonation = ImpersonationLevel.Impersonate,
Authentication = AuthenticationLevel.PacketPrivacy
};
var objPath = string.Format("IISApplicationPool.Name='W3SVC/AppPools/{0}'", appPoolName);
var scope = new ManagementScope(string.Format(@"\\{0}\root\MicrosoftIISV2", machineName), co);
using (var mc = new ManagementObject(objPath))
{
mc.Scope = scope;
mc.InvokeMethod(methodToInvoke, null, null);
}
由于底层更改,此代码不适用于 IIS 7,因此我们目前正在尝试:
using (ServerManager serverManager = ServerManager.OpenRemote(machineName))
{
var appPool = serverManager.ApplicationPools[appPoolName];
if (appPool != null)
{
appPool.Stop(); // or app.Start() or app.Recycle()
serverManager.CommitChanges();
}
}
上面的代码在我的工作站上运行良好,该工作站运行 Windows 7(以及 IIS 7.5)。但是,当我将此代码部署到我们的应用程序服务器时,它不起作用。它得到这个错误:
System.InvalidCastException:
Unable to cast COM object of type 'System.__ComObject' to interface type
'Microsoft.Web.Administration.Interop.IAppHostWritableAdminManager'.
This operation failed because the QueryInterface call on the COM component for the
interface with IID '{FA7660F6-7B3F-4237-A8BF-ED0AD0DCBBD9}' failed due to the following error:
Interface not registered (Exception from HRESULT: 0x80040155).
根据我的研究,这是因为 IIS 7 在 Windows Server 2003 服务器上不可用。 (我确实包含了 Microsoft.Web.Administration.dll 文件。)
所以我的问题是:
- 上面的 IIS 7 代码是否可以在 Windows 2003 服务器上运行?
- 如果对#1 不满意,有没有更好的方法来做到这一点?
【问题讨论】:
标签: c# iis iis-7 windows-server-2008 windows-server-2003