Does anyone have a bulletproof method (in C# ideally!) of determining if ASP.Net is properly registered on your computer ?
I am writing an installation program for an ASP.Net application and I need to know whether I should run aspnet_regiis
.
At the moment we always run aspnet_regiis
- I to ensure that ASP.Net is registered properly but this undesirable because it prompts a restart of all the application pools.
There are several useful pages on the web (e.g. http://www.codeproject.com/KB/cs/iisdetection.aspx) but as the comments in that post show, it is quite often the case that the registry reports that ASP.Net is registered but aspnet_regiis
still needs to be run to configure IIS. The user 'JonB' posted something that looks like it should work for IIS6 (and IIS7 with IIS6 compatibility enabled) but I would still need to write separate detection code for IIS 7 with IIS6 compatibility mode disabled.
So has anyone cracked this nut already? If so please let us know as it will be a time saver. Otherwise I will try and port the C++ solution into C# for IIS6 and for IIS7 I will look examine the <isapiCgiRestriction>
section of applicationHosts.config
for
<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" />
Last question...
Does anyone know if things are the same/different in Windows 7?
First I would try running aspnet_regiis -lv
. This should give you an output like:
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
that you can easily parse to verify that your target version is installed and valid. If it is not, you'll have to go the aspnet_regiis -i
route.
Also, given that you can do this check in C#, you could add a test page to your ASP.NET application. After what you would normally consider a successful installation, do a HttpWebRequest
on that test page. The page itself can be as simple as an empty page and as complicated as running a self-check of the installation (file/folder permissions, DB configuration, etc.) and would only return a HTTP 200 if everything is ok. Any timeout or error indicates a bad install. Then,optionally, delete the test page.
This snippet works for 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
}
...
You can adjust it as you want.