IIS 7.5にプログラムでASP.NET 4.0が登録されているかどうかを確認する信頼できる方法はありますか?前提条件としてインストーラーでテストする必要があります、ASP.NETアプリケーションのインストール開始前。
ASP.NET 4.0がIISに登録されていない場合、インストール中にインストールしたばかりのアプリケーションを実行できず、500内部サーバーエラーが返されます(問題を解決するには遅すぎます)。代わりに、インストール手順を開始する前に警告(および問題の解決方法のヒント)を表示したいと思います。しかし、信頼できる解決策はまだ見つかりませんでした。
AFAIK、レジストリエントリの読み取りが正しく機能しない場合があります。そこで、aspnet_regiis.exe -lv
を実行してバージョンを一覧表示し(推奨 here )、出力を解析します。 しかし、.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
を実行すると修復できます。
これはこれと同様の問題 question ですが、プログラムでテストする必要があります。
何かアイデアや経験はありますか?
概要:上記の問題は、サーバー以外のオペレーティングシステム(Win7)で発生します。 IIS before .NET 4.0をインストールしても、.NET 4.0はIIS= IIS正しく)に登録されます。これにより、ASP.NETアプリケーションのインストール中に予期しない問題が発生します-aspnet_regiis.exe -ir
はコマンドラインから実行されます。 Win 2008には問題はありません(つまり、IISが.NET 4.0より前にインストールされている場合、.NETはIISに正しく登録されており、すべて期待どおりに機能します)。
それで、最後に私の同僚は、問題の解決策になる可能性があるものを教えてくれました。次の解決策が正常に機能することを確認しました(Win7でも)。 ServerManager
from Microsoft.Web.Administration
名前空間は簡単に使用できます。
public static bool IsAspNetRegistered()
{
using (var mgr = new ServerManager())
{
return mgr.ApplicationPools.Any(pool => pool.ManagedRuntimeVersion == "v4.0");
}
}
IISでの.NET登録が成功した場合、ランタイムバージョンが「v4.0」に設定されているアプリケーションプールが少なくとも1つあるため、この事実がチェックに使用されました。
もちろん、誰かがすべてのアプリケーションプールを削除した場合、この方法は正しく機能しません。しかし、これは私が気にしない少し病的な状況です。主な問題は、すべてがインストールの推奨事項に従って行われているにもかかわらず、アプリケーションをマシンにインストールできないことを防ぐことです。
独自の答えを基礎として使用して、これはコマンドライン(昇格あり)を使用して行うこともできます。
%WINDIR%\System32\inetsrv\appcmd.exe list apppool /managedRuntimeVersion:v4.0
何かが返された場合、ASP.NET 4.0が登録されています。このアプローチの問題は、フィルターがインストールされていなくても手動で4.0アプリケーションプールを作成することが可能であると思われ、この方法が機能しないことです。
編集:私はこれらの3つのチェックを実行することになりました:
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ビットバージョンだけであることに注意してください。
3つすべてのチェックに合格した場合、ASP.NET 4.0が登録されていると判断できます。それでも100%誤検知防止ではありません。
これは古い質問ですが、あなたの質問はグーグルのトップ結果の1つであり、未回答であるため、私は回答を投稿しています。
お探しのレジストリキーは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
。
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
}