Partager via


Using LINQ with Microsoft.Web.Administration

With the upcoming release of .NET 3.5 and LINQ I thought it would be interesting to show some of the cool things you can do with IIS 7 and LINQ. Everything that I will do can be done with C# 2.0 code but it would take me several lines of code to write them but thanks to LINQ you can do them in about a line or two.

Let's start with a very basic example that does not use LINQ but just M.W.A (Microsoft.Web.Administration) and then start adding interesting things to it.

The following code just iterates the sites in IIS and displays their name.

using System;
using System.Linq;
using Microsoft.Web.Administration;
class Program {
    static void Main(string[] args) {
        using (ServerManager serverManager = new ServerManager()) {

            var sites = serverManager.Sites;
            foreach (Site site in sites) {
                Console.WriteLine(site.Name);
            }
        }
    }
}

Now, let's say I wanted to have them sorted by their name. This is where LINQ starts being useful

    using (ServerManager serverManager = new ServerManager()) {

        var sites = (from site in serverManager.Sites
            orderby site.Name
            select site);

        foreach (Site site in sites) {
            Console.WriteLine(site.Name);
        }
    }

Say you want to start all the sites that are stopped:

    using (ServerManager serverManager = new ServerManager()) {

        var sites = (from site in serverManager.Sites
            where site.State == ObjectState.Stopped
            orderby site.Name
            select site);

        foreach (Site site in sites) {
            site.Start();
        }
    }

OK, now let's imagine I want to find all the applications that are configured to run in the Default ApplicationPool and move them to run in my NewAppPool. This would take me a lot more lines of code but now I can just do:

    using (ServerManager serverManager = new ServerManager()) {

        var apps = (from site in serverManager.Sites
            from app in site.Applications
            where app.ApplicationPoolName.Equals("DefaultAppPool", StringComparison.OrdinalIgnoreCase)
            select app);

        foreach (Application app in apps) {
            app.ApplicationPoolName = "NewAppPool";
        }

        serverManager.CommitChanges();
    }

Now let's say I want to find the top 20 distinct URL's of all the requests running in all my worker processes that has taken more than 1 second.

    using (ServerManager serverManager = new ServerManager()) {

        var requests = (
            from wp in serverManager.WorkerProcesses
            from request in wp.GetRequests(1000)
            orderby request.TimeElapsed descending
            select request).Distinct().Take(20);

        foreach (Request request in requests) {
            Console.WriteLine(request.Url);
    }
}

OK, finally let's say I want to display a table of all the applications running under DefaultAppPool and display if Anonymous authentication is enabled or not. (Now this one is almost on the edge of "you should do it differently, but it is Ok if you are only reading a single value from the section):

    using (ServerManager serverManager = new ServerManager()) {

        var items = from site in serverManager.Sites
            from app in site.Applications
            where app.ApplicationPoolName.Equals("DefaultAppPool", StringComparison.OrdinalIgnoreCase)
            orderby site.Name, app.Path
            select new {
                Site = site,
                Application = app,
                AnoymousEnabled = ((bool)app.GetWebConfiguration().GetSection("system.webServer/security/authentication/anonymousAuthentication")["enabled"])
            };

        foreach (var item in items) {
            Console.WriteLine("Site:{0,-18} App:{1, -10} Anonymous Enabled:{2}",
                item.Site.Name, item.Application.Path, item.AnoymousEnabled);
        }
    }

As you can see LINQ is an incredibly useful feature in C# 3.0 and in conjunction with Microsoft.Web.Administration allows you to do incredibly complex operations in IIS with just few lines of code.

Comments

  • Anonymous
    October 24, 2007
    Did you see this post at blogs.msdn.com
  • Anonymous
    October 24, 2007
    The comment has been removed
  • Anonymous
    October 24, 2007
    The comment has been removed
  • Anonymous
    October 24, 2007
    The comment has been removed
  • Anonymous
    October 24, 2007
    The comment has been removed
  • Anonymous
    November 01, 2007
    In version 7 of IIS a powerful new API for administering the server from managed code is exposed in the
  • Anonymous
    November 01, 2007
    Okay... I might have to give this LINQ stuff a bit more consideration now.
  • Anonymous
    January 22, 2008
    Para entender mas el poder de LINQ los invito a revisar el post de mi amigo Charly Aguilar , que es Lead
  • Anonymous
    January 22, 2008
    Para entender mas el poder de LINQ los invito a revisar el post de mi amigo Charly Aguilar , que es Lead
  • Anonymous
    January 29, 2008
    Here a very nice post of Carlos Aguilar Mare that shows how you can use the power of LINQ to query Internet