Wednesday, April 13, 2011

Programmatically creating an IIS7 site

Create a new solution and add a reference to C:\Windows\System32\InetServ\Microsoft.Web.Administration.dll. Paste the following code and you've got yourself a website on port 82 using the default application pool. In IIS it's named MyCoolWebsite.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Web.Administration;

namespace TestApp
{
  class Program
  {
    static void Main(string[] args)
    {
      string siteName = "MyCoolWebsite";
      string applicationPoolName = "DefaultAppPool";
      string virtualDirectoryPath = "/";
      string virtualDirectoryPhysicalPath = "C:\\temp\\";
      string ipAddress = "*";
      string tcpPort = "81";
      string hostHeader = "";
      string applicationPath = "/";
      long highestId = 1;

      using (ServerManager mgr = new ServerManager())
      {
        Site site = mgr.Sites[siteName];
        if (site != null)
          return; // Site bestaat al

        ApplicationPool appPool = mgr.ApplicationPools[applicationPoolName];
        if (appPool == null)
          throw new Exception(String.Format("Application Pool: {0} does not exist.", applicationPoolName));

        foreach (Site mysite in mgr.Sites)
        {
          if (mysite.Id > highestId)
            highestId = mysite.Id;
        }
        highestId++;

        site = mgr.Sites.CreateElement();
        site.SetAttributeValue("name", siteName);
        site.Id = highestId;
        site.Bindings.Clear();

        string bind = ipAddress + ":" + tcpPort + ":" + hostHeader;

        Binding binding = site.Bindings.CreateElement();
        binding.Protocol = "http";
        binding.BindingInformation = bind;
        site.Bindings.Add(binding);
        //site.Bindings.Add(bind, "http");

        Application app = site.Applications.CreateElement();
        app.Path = applicationPath;
        app.ApplicationPoolName = applicationPoolName;
        VirtualDirectory vdir = app.VirtualDirectories.CreateElement();
        vdir.Path = virtualDirectoryPath;
        vdir.PhysicalPath = virtualDirectoryPhysicalPath;
        app.VirtualDirectories.Add(vdir);
        site.Applications.Add(app);

        mgr.Sites.Add(site);
        mgr.CommitChanges();
      }
    }
  }
}

No comments: