ASP.Netがコンピューターに適切に登録されているかどうかを確認するための防弾方法(理想的にはC#で!)
ASP.Netアプリケーションのインストールプログラムを書いていて、aspnet_regiis
を実行する必要があるかどうかを知る必要があります。
現時点では常にaspnet_regiis
を実行しています。ASP.Netが正しく登録されていることを確認していますが、すべてのアプリケーションプールの再起動を促すため、これは望ましくありません。
Webにはいくつかの便利なページがあります(例 http://www.codeproject.com/KB/cs/iisdetection.aspx )が、その投稿のコメントが示すように、それはかなり頻繁に起こりますレジストリは、ASP.Netが登録されていることを報告しますが、IISを構成するにはaspnet_regiis
を実行する必要があります。ユーザー 'JonB'は、IIS6(およびIIS6互換性を有効にしたIIS7)で機能するように見えるものを投稿しましたが、IIS 7 for IIS6互換性モードを無効にして)の個別の検出コードを書く必要があります。
それで、誰かがすでにこのナットをクラックしましたか?その場合は時間の節約になりますのでお知らせください。それ以外の場合は、IIS6のC++ソリューションをC#に移植してみます。IIS7の場合、<isapiCgiRestriction>
のapplicationHosts.config
セクションを調べて、
<add path="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" allowed="true" groupId="ASP.NET v2.0.50727" description="ASP.NET v2.0.50727" />
最後の質問...
何かがWindows 7で同じ/異なるかどうか誰かが知っていますか?
まず、aspnet_regiis -lv
を実行してみます。これにより、次のような出力が得られます。
1.1.4322.0 Valid C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll
2.0.50727.0 Valid c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll
簡単に解析して、ターゲットバージョンがインストールされ、有効であることを確認できます。そうでない場合は、aspnet_regiis -i
ルートに移動する必要があります。
また、C#でこのチェックを実行できる場合、テストページをASP.NETアプリケーションに追加できます。インストールが正常に行われたと通常思っていることの後で、そのテストページでHttpWebRequest
を実行します。ページ自体は空のページのように単純で、インストールの自己チェック(ファイル/フォルダーのアクセス許可、DB構成など)を実行するのと同じくらい複雑で、すべてが正常な場合にのみHTTP 200を返します。タイムアウトまたはエラーは、インストールが不適切であることを示します。次に、オプションで、テストページを削除します。
このスニペットはIIS7以降で機能します
using Microsoft.Web.Administration;
private static string[] ARR_STR_SUPPORTED_APP_POOLS =
{ "ASP.NET v4.0", "ASP.NET v4.5", ".NET v4.5", ".NET v4.0" };
public static ApplicationPool GetFirstSupportedAppPoolInstalled(this ServerManager mgr, IEnumerable<string> supportedAppPools)
{
ApplicationPool result = null;
foreach (string appPoolName in supportedAppPools)
{
result = mgr.ApplicationPools[appPoolName];
if (result != null)
break;
}
return result;
}
...
using (var mgr = new ServerManager())
{
if (!mgr.IISAccessCheck())
throw new ApplicationException("Error trying to access IIS 7!");
ApplicationPool appPool = mgr.GetFirstSupportedAppPoolInstalled(ARR_STR_SUPPORTED_APP_POOLS);
if (appPool == null)
throw new ApplicationException("No appropriate .NET application pool found!");
// you can do something with the app pool, if needed
}
...
必要に応じて調整できます。