Print | posted on Wednesday, October 29, 2008 8:28 PM
I've had a bunch of requests to start talking more about IIS7 development and whilst I've covered some examples of this previously in my SharePoint and Windows 2008 presentations I thought I'd start by providing a very simple example from APM. This is also to answer (bizarrely) the same question from two readers of this blog.
This example shows how to retrieve a list of Application Pools on the box. You'd think this would be straightforward and efficient right? and easy to do in managed code without any nastiness? right? :) wrong. On IIS6 this is what you need to do:
// enumerates App Pools and properties (using legacy IIS6 metabase)
private static AppPools GetAppPoolsIIS6()
{
AppPools ret = new AppPools();
try
{
using (DirectoryEntry appPools = new DirectoryEntry(_metabasePath))
{
foreach (DirectoryEntry ap in appPools.Children)
{
AppPool item = new AppPool();
item.Name = ap.Name;
item.Status = GetAppPoolState((int)ap.Properties["AppPoolState"].Value);
item.Pids = GetProcessIDs(ap.Name);
ap.Dispose();
ret.Add(item);
}
}
}
catch (Exception ex)
{
ret = null;
throw ex;
}
return ret;
}
Of course there is some other stuff in here for my specific requirements in APM - I have a custom class to wrap the other information on the app pools I use later on, so ignore that stuff.
So this is calling System.DirectoryServices (which is a managed code wrapper for ADSI - which is a nasty wrapper for LDAP) to query the metabase, then I have to iterate through the DirectoryEntry collection, which is completely ignorant of type - note the disgusting literals necessary. It's basically horrible code and not just because I wrote it. It's the definition of platform hygiene issues :)
Here's how to do the same thing using Microsoft.Web.Administration:
// enumerates App Pools (using Microsoft.Web.Administration)
private static ArrayList GetAppPoolNamesIIS7()
{
ArrayList ret = new ArrayList();
try
{
using (ServerManager serverManager = new ServerManager())
{
foreach (ApplicationPool ap in serverManager.ApplicationPools)
{
ret.Add(ap.Name);
}
}
}
catch (Exception ex)
{
ret = null;
throw ex;
}
return ret;
}
I think you get the point... No horrible wrapped wrappers for native libraries, no chances of any type foul ups. Clean, simple and fast - just how it should be.
Of course I realise I need to dust off my HTML skillz and sort out some code formatting on this here blog, but right now I can't be bothered!