2012-04-16 21 views
4

我想更改Enable32BitAppOnWin64使用C#的属性。我知道与IIS 6IIS 7交互的方式是不同的。但我需要两种版本的解决方案。如何在IIS 6和IIS 7中使用c启用32位应用程序模式#

+1

有没有常见的方法,因此没有共同的解决方案。你必须为IIS 6做点什么,而对于IIS 7来说则完全不同。 – 2012-04-18 08:31:10

+0

@Lex当然,我知道。正如我提到的问题,我需要两个版本的分离解决方案。谢谢你的评论 – 2012-04-18 08:45:41

回答

11

有编程的方式管理几个不同的IIS 6和IIS 7

IIS 6使用DirectoryEntry类和元数据库数据库API编程管理。

IIS 7使用Microsoft.Web.Administration程序集 和ServerManager类进行管理。

此外,IIS 6不能同时运行64位和32位工作进程 (请参阅MSDN BLOG)。 因此,对于IIS 6,将Enable32BitAppOnWin64设置为true意味着所有worker 进程(所有应用程序池)都作为32位进程运行。

IIS 7能够同时运行64位和32位工作进程。 这意味着您为特定应用程序池 设置了Enable32BitAppOnWin64,而不是针对所有应用程序池。

您还必须检测IIS的版本才能使用正确的API。 这可以通过从注册表 阅读下面的DWORD值(有关详细信息,请参阅Learn IIS)来完成:

HKLM\Software\Microsoft\InetStp\MajorVersion and 
HKLM\Software\Microsoft\InetStp\MinorVersion 

所以,这里是一些代码来设置Enable32BitAppOnWin64对于IIS 6和IIS 7 (请注意,你必须引用Microsoft.Web.AdministrationSystem.DirectoryServices组件在Visual Studio项目):

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"); 
} 

我还要提到的是有使用配置数据库API的可能性 也适用于IIS 7。在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(); 
    } 
} 

当然,那么你不必参考Microsoft.Web.Administration组件。

相关问题