Подтвердить что ты не робот

Как проверить, зарегистрирован ли 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, но мне нужно проверить ее программно.

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

4b9b3361

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