IIS6 应用程序池的问题在于,与 IIS7 不同,它们不知道正在加载到其中的 .NET Framework 版本。
IIS6 websites确定站点或子应用程序的脚本映射指向的 ASP.NET 版本将哪个 .NET Framework 运行时加载到池中。工作进程只会盲目地加载映射到扩展名(或通配符映射中定义的任何内容)的必需 ISAPI DLL。
这种旧方法通常会造成很多麻烦,其中分配到同一池的两个不同站点可能被配置为运行不同版本的 ASP.NET,并且您会得到臭名昭著的结果:
...并且以下事件被记录到 Windows 应用程序日志中:
Event Type: Error
Event Source: ASP.NET 2.0.50727.0
Event Category: None
Event ID: 1062
Date: 12/01/2011
Time: 12:31:43
User: N/A
Computer: KK-DEBUG
Description:
It is not possible to run two different versions of ASP.NET in the same
IIS process. Please use the IIS Administration Tool to reconfigure your
server to run the application in a separate process.
确定应用程序池配置运行的 .NET 版本的唯一方法是遍历分配该池的每个站点并检查原始脚本映射。
唯一的问题是(例如)无论出于何种原因,您有一个配置错误的站点(或子应用程序),该站点(或子应用程序)不再使用,并且被设置为使用不同版本的 ASP.NET,例如:
Site .NET Version Application Pool
============================================================
WebSite1 ASP.NET 4.0 AppPool1
WebSite2 (no longer used) ASP.NET 2.0 AppPool1
在这种情况下,您必须决定哪个站点优先确定框架版本。
此 PowerShell 脚本可以帮助您确定每个池中使用的 ASP.NET 版本:
# Walk sites
$allsites = ([adsi]"IIS://Localhost/W3SVC").children | where { $_.SchemaClassName -eq "IIsWebServer" }
$pools = @()
foreach($site in $allsites)
{
$path = "IIS://Localhost/W3SVC/" + $site.Name + "/root"
$siteRoot = [adsi]$path
$sitePool = $siteRoot.AppPoolId
$aspx = $siteRoot.ScriptMaps | where { $_.StartsWith(".aspx") }
if( $aspx.Contains("v1.1")) {
$runtime = "1.1"
} elseif ($aspx.Contains("v2.0")) {
$runtime = "2.0"
} elseif( $aspx.Contains("v4.0")) {
$runtime = "4.0"
} else {
$runtime = "Unknown"
}
$v = @{AppPool = $siteRoot.AppPoolId; RunTime = $runtime; SiteId = $site.Name}
$pools += $v
}
$pools | Sort-Object { $_.AppPool } | % { Write-Host $_.AppPool $_.SiteId $_.RunTime }
它仅遍历根级别的站点,不会递归地遍历每个站点来识别子应用程序。