如何检查IIS 7.5上是否注册了ASP.NET 4.0

13

有没有可靠的方法可以编程地检查在IIS 7.5上是否注册了ASP.NET 4.0?我需要在安装程序中作为先决条件进行测试,在ASP.NET应用程序安装开始之前。

如果ASP.NET 4.0未在IIS上注册,稍后在安装过程中仅安装的应用程序将无法运行,并返回500内部服务器错误(解决问题已经太迟)。相反,我希望在任何安装步骤开始之前显示一些警告(和提示如何解决问题)。但是还没有找到可靠的解决方案。

据我所知,读取注册表条目有时可能不正确。因此,现在我运行aspnet_regiis.exe -lv来列出版本(正如这里建议的那样),并解析输出。但是,即使.NET没有正确注册,我的测试也会成功(错误地),因为输出包含版本4.0:

2.0.50727.0     C:\Windows\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll
4.0.30319.0     C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll

(Win7 32位)

在这种情况下,运行aspnet_regiis.exe -ir可以修复它。

这类似于这个问题,但我需要以编程方式进行测试。

你有任何想法或经验吗?

4个回答

10

使用您自己的答案作为基础,这也可以使用命令行(提升权限)完成:

%WINDIR%\System32\inetsrv\appcmd.exe list apppool /managedRuntimeVersion:v4.0
如果有任何返回值,则注册了ASP.NET 4.0。 这种方法的问题在于,即使未安装筛选器,似乎也可以手动创建4.0应用程序池,那么此方法将无法使用。
编辑: 我最终运行了以下三个检查:
  1. aspnet_regiis.exe -lv (应返回包含“c:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll”一行)
  2. appcmd.exe list apppool /managedRuntimeVersion:v4.0 (应返回包含“MgdVersion:v4.0”一行)
  3. appcmd.exe list config -section:system.webServer/isapiFilters (应返回包含“c:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_filter.dll”一行)
请注意,我只关心32位版本。
如果所有三个检查都通过,则可以得出结论:已注册ASP.NET 4.0。尽管仍然无法100%排除误报。

我们正在诊断一个返回404.3的.Net 4.0服务相关问题,并发现基础设施团队没有在服务器上安装HTTP激活功能,所以如果您遇到WCF服务问题,检查此项也是一个好方法。 - Antony Gibbs

6

虽然这是一个老问题,但我还是回答一下,因为你的问题在谷歌上排名靠前,并且没有答案。

你要查找的注册表键是HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\4.0.30319.0。如果该键存在,则说明已安装并在IIS中注册了.NET 4。

如果你只想检查.NET 4是否已安装,可以检查HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full


谢谢回答,但它不起作用。我在我的虚拟机中有一个Win 7 32位系统,其配置与问题描述中完全相同,并且注册表中的密钥存在。但是会发生完全相同的问题(即这并不意味着.NET已正确注册)。 - zbynour
伙计们,我需要以编程方式测试多少次才够? - zbynour
@JasonKulatunga 这会改变什么吗? - stej
@zbynour 在32位系统上,请检查HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\ASP.NET\4.0.30319.0。 - Daniel Fisher lennybacon
基于我的问题本身以及我上面的最后一条评论:很明显,Win7操作系统是个问题。这个答案中描述的方法在Win7上完全不起作用,因此根本不是可接受的解决方案(即使考虑Wow6432Node)。 - zbynour
显示剩余4条评论

4
在Powershell中可以这样做:
# load the IIS-Commandlets
Import-Module WebAdministration 

# get the isapi filters currently loaded
Get-WebConfigurationProperty -Filter "/system.webServer/isapiFilters/filter" -name *

输出可能如下所示:
name           : ASP.Net_4.0_32bit<br/>
path           : %windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_filter.dll<br/>
enabled        : True<br/>
enableCache    : True<br/>
preCondition   : runtimeVersionv4.0,bitness32<br/>
ItemXPath      : /system.webServer/isapiFilters/filter[@name='ASP.Net_4.0_32bit']<br/>
Attributes     : {name, path, enabled, enableCache...}<br/>
ChildElements  : {}<br/>
ElementTagName : filter<br/>
Methods        :<br/>
Schema         : Microsoft.IIs.PowerShell.Framework.ConfigurationElementSchema<br/>

name           : ASP.Net_4.0_64bit<br/>
path           ........

基于此,我们可以编写以下代码来检查并安装.NET 4(如果需要):

$DotNet4Missing = $true

# lets make sure we got .net 4 correctly setup
$isapiFilters = Get-WebConfigurationProperty -Filter "/system.webServer/isapiFilters/filter" -name *

"/system.webServer/isapiFilters/filter count: {0}" -f $isapiFilters.Count
foreach ($filter in $isapiFilters)
{
    "filter.name: {0}" -f $filter.name
    if ($filter.name -eq "ASP.Net_4.0_64bit")
    {
        "-> Found .NET 4 - GREAT!"
        $DotNet4Missing = $false
    }        
}    

if ($DotNet4Missing)
{
    "Missing .NET 4 IIS integration - running aspnet_regiis.exe"

    $pinfo = New-Object System.Diagnostics.ProcessStartInfo
    $pinfo.FileName = "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe"
    $pinfo.RedirectStandardError = $true
    $pinfo.RedirectStandardOutput = $true
    $pinfo.UseShellExecute = $false
    $pinfo.Arguments = "-iru"
    $p = New-Object System.Diagnostics.Process
    $p.StartInfo = $pinfo
    $p.Start() | Out-Null
    $p.WaitForExit()
    $stdout = $p.StandardOutput.ReadToEnd()
    $stderr = $p.StandardError.ReadToEnd()

    "aspnet_regiis.exe stdout: {0}" -f $stdout
    "aspnet_regiis.exe stderr: {0}" -f $stderr
    "aspnet_regiis.exe ExitCode: {0}" -f $p.ExitCode
}

3
概述:上述问题发生在非服务器操作系统(Win7)上。即使您先安装IIS(因此.NET应正确注册在IIS上),但.NET 4.0未在IIS上注册。这会导致在安装任何ASP.NET应用程序期间出现意外问题--直到从命令行运行aspnet_regiis.exe -ir。Win 2008没有问题(即,当IIS在.NET 4.0之前安装时,.NET已正确注册在IIS上,并且一切都按预期工作)。
因此,最终我的同事告诉了我可能是解决问题的方法。我已经验证以下解决方案可以正常工作(也适用于Win7)。可以轻松使用来自Microsoft.Web.Administration命名空间的ServerManager
public static bool IsAspNetRegistered()
{
    using (var mgr = new ServerManager())
    {
        return mgr.ApplicationPools.Any(pool => pool.ManagedRuntimeVersion == "v4.0");
    }
}

如果在IIS上成功注册.NET,那么至少有一个应用程序池的运行时版本设置为“v4.0”,所以这一事实被用于检查。

当然,如果有人删除了所有应用程序池,这种方法可能不起作用。但这是一种比较病态的情况,我并不关心。主要问题是要防止尽管按照我们的安装建议完成了所有操作,仍然无法在计算机上安装应用程序。


@DanielFisherlennybacon 不,那肯定不是真的。有一个使用 AnyCPU 选项编译的 Microsoft.Web.Administration.dll。既然如此,为什么要踩它呢? - zbynour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接