Как проверить, зарегистрирован ли ASP.NET 4.0 на IIS 7.5

Есть ли надежный способ проверить, был ли ASP.NET 4.0 зарегистрирован на IIS 7.5 программным путем? Мне нужно проверить его в установщике как обязательное условие, прежде чем начнется установка приложения ASP.NET.

Если ASP.NET 4.0, не зарегистрированный в IIS, позже во время установки только что установленное приложение не может быть запущено и возвращает 500 внутренних ошибок сервера (и это слишком поздно, чтобы решить проблему). Вместо этого я хочу показать предупреждение (и подсказку, как решить проблему) до того, как начнутся какие-либо шаги установки. Но надежного решения пока не найдено.

AFAIK, чтение записей в реестре иногда может работать неправильно. Итак, теперь я запускаю 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 32bit)

Запуск aspnet_regiis.exe -ir может в этом случае восстановить его.

Аналогичная проблема с этим question, но мне нужно проверить ее программно.

Есть ли у вас какие-либо идеи или опыт?

Ответ 1

Резюме. Описанная выше проблема возникает в операционной системе, отличной от сервера (Win7)..NET 4.0 не зарегистрирован в IIS, даже если вы устанавливаете IIS до .NET 4.0 (и поэтому .NET должен быть зарегистрирован на IIS правильно). Это вызывает непредвиденные проблемы во время установки любого приложения ASP.NET - до тех пор, пока aspnet_regiis.exe -ir не будет запущено из командной строки. Нет проблем с Win 2008 (т.е. Когда IIS установлен до .NET 4.0, тогда .NET зарегистрирован правильно в IIS, и все работает так, как ожидалось).

Итак, наконец, мой коллега рассказал мне, что может быть решением проблемы. Я проверил, что следующее решение работает нормально (также на Win7). ServerManager из Microsoft.Web.Administration пространство имен может быть легко использовано:

public static bool IsAspNetRegistered()
{
    using (var mgr = new ServerManager())
    {
        return mgr.ApplicationPools.Any(pool => pool.ManagedRuntimeVersion == "v4.0");
    }
}

В случае успешной регистрации .NET в IIS существует, по крайней мере, один пул приложений, для версии которого установлена ​​ "v4.0", поэтому этот факт использовался для проверки.

Конечно, если кто-либо удаляет все пулы приложений, этот метод может работать некорректно. Но это немного патологическая ситуация, мне все равно. Основная проблема заключается в том, чтобы предотвратить, что, хотя все сделано в соответствии с нашими рекомендациями по установке, все еще невозможно установить приложение на машине.

Ответ 2

Используя свой собственный ответ в качестве основы, это также можно сделать с помощью командной строки (с увеличением):

%WINDIR%\System32\inetsrv\appcmd.exe list apppool /managedRuntimeVersion:v4.0

Если что-то возвращается, регистрируется ASP.NET 4.0. Проблема с этим подходом заключается в том, что, возможно, возможно создать пулы приложений 4.0 вручную, даже если фильтр не установлен, и тогда этот метод не будет работать.


EDIT: Я закончил выполнение этих трех проверок:

  • aspnet_regiis.exe -lv (должен возвращать строку, содержащую "c:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" )
  • appcmd.exe list apppool /managedRuntimeVersion:v4.0 (должен возвращать строку, содержащую "MgdVersion: v4.0" )
  • 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% ложно положительно-доказательство.

Ответ 3

Это старый вопрос, но я отправляю ответ, потому что ваш вопрос является одним из лучших результатов в google, и он не отвечает.

Ключ реестра, который вы ищете, HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\4.0.30319.0. Если этот ключ присутствует, то .Net 4 был установлен и зарегистрирован в IIS.

Если вы просто хотите проверить, установлен ли .Net 4, вы можете проверить HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full.

Ответ 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
}