Far*_*ker 4 c# iis-7 iis-6 32bit-64bit
我想使用C#更改Enable32BitAppOnWin64属性.我知道与IIS 6和IIS 7交互的方式是不同的.但我需要两个版本的解决方案.
Han*_*ans 11
在以编程方式管理IIS 6和IIS 7方面存在一些差异.
IIS 6使用DirectoryEntry类和元数据库数据库API 以编程方式进行管理.
IIS 7使用Microsoft.Web.Administration程序集和ServerManager类进行管理.
此外,IIS 6无法同时运行64位和32位工作进程(请参阅此MSDN博客).所以设置Enable32BitAppOnWin64到true为IIS 6意味着所有工作进程(所有应用程序池)正在运行32个的进程.
IIS 7能够同时运行64位和32位工作进程.这意味着您Enable32BitAppOnWin64为特定应用程序池而不是所有应用程序池设置.
您还必须检测IIS的版本才能使用正确的API.这可以通过从注册表中读取以下DWORD值来完成(有关更多信息,请参阅学习IIS):
HKLM\Software\Microsoft\InetStp\MajorVersion and
HKLM\Software\Microsoft\InetStp\MinorVersion
Run Code Online (Sandbox Code Playgroud)
因此,这里有一些Enable32BitAppOnWin64为IIS 6和IIS 7 设置的代码(请注意,您必须在Visual Studio项目中引用Microsoft.Web.Administration
和System.DirectoryServices程序集):
private static Version GetIISVerion()
{
using (RegistryKey inetStpKey =
Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\InetStp"))
{
int majorVersion = (int)inetStpKey.GetValue("MajorVersion");
int minorVersion = (int)inetStpKey.GetValue("MinorVersion");
return new Version(majorVersion, minorVersion);
}
}
private static void Enable32BitAppOnWin64IIS7(string appPoolName)
{
Console.Out.WriteLine("Setting Enable32BitAppOnWin64 for {0} (IIS7)", appPoolName);
using (ServerManager serverMgr = new ServerManager())
{
ApplicationPool appPool = serverMgr.ApplicationPools[appPoolName];
if (appPool == null)
{
throw new ApplicationException(String.Format("The pool {0} does not exist", appPoolName));
}
appPool.Enable32BitAppOnWin64 = true;
serverMgr.CommitChanges();
}
}
private static void Enable32BitAppOnWin64IIS6(string serverName)
{
Console.Out.WriteLine("Setting Enable32BitAppOnWin64 for IIS6");
using (DirectoryEntry appPools =
new DirectoryEntry(String.Format("IIS://{0}/W3SVC/AppPools", serverName)))
{
appPools.Properties["Enable32BitAppOnWin64"].Value = true;
appPools.CommitChanges();
}
}
public static void Enable32BitAppOnWin64(string serverName, string appPoolName)
{
Version v = GetIISVerion(); // Get installed version of IIS
Console.Out.WriteLine("IIS-Version: {0}", v);
if (v.Major == 6) // Handle IIS 6
{
Enable32BitAppOnWin64IIS6(serverName);
return;
}
if (v.Major == 7) // Handle IIS 7
{
Enable32BitAppOnWin64IIS7(appPoolName);
return;
}
throw new ApplicationException(String.Format("Unknown IIS version: {0}", v.ToString()));
}
static void Main(string[] args)
{
Enable32BitAppOnWin64(Environment.MachineName, "DefaultAppPool");
}
Run Code Online (Sandbox Code Playgroud)
我还应该提一下,也可以使用IIS 7的配置数据库API.在Windows Server 2008操作系统上,您可以安装名为"IIS 6管理兼容性"的角色服务.此角色服务使您可以使用"旧"IIS 6 API来管理IIS 7.
如果"IIS 6管理兼容性"是一个选项,您可以Enable32BitAppOnWin64IIS7按如下方式更改功能:
private static void Enable32BitAppOnWin64IIS7(string serverName, string appPoolName)
{
Console.Out.WriteLine("Setting Enable32BitAppOnWin64 for {0} (IIS7)", appPoolName);
using (DirectoryEntry appPools =
new DirectoryEntry(String.Format("IIS://{0}/W3SVC/AppPools/{1}", serverName, appPoolName)))
{
appPools.Properties["Enable32BitAppOnWin64"].Value = true;
appPools.CommitChanges();
}
}
Run Code Online (Sandbox Code Playgroud)
当然,那么你不必参考Microsoft.Web.Administration组件.