Makale Özeti

Microsoft Framework 3.0'dan itibaren IIS 7 API'si sayesinde IIS 7'deki yönetimsel işlemleri artık Microsoft.Web.Administration namespace'ini kullanarak yazdığımız uygulamalar üzerinden gerçekleştirebiliyoruz. Bu işlemler site, application, application pool, application domain, virtual directory oluşturma, silme gibi işlemler olabilir. Aynı zamanda IIS üzerindeki bu nesnelerin tüm property'lerini de bu API sayesinde okuyabilir veya set edebiliriz. Bu makalemde bahsettiğim bu işlemleri C# ile nasıl yapabileceğimizi anlatacağım.

Makale

Merhabalar,

Microsoft Framework 3.0'dan itibaren IIS 7 API'si sayesinde IIS 7'deki yönetimsel işlemleri artık Microsoft.Web.Administration namespace'ini kullanarak yazdığımız uygulamalar üzerinden gerçekleştirebiliyoruz. Bu işlemler site, application, application pool, application domain, virtual directory oluşturma, silme gibi işlemler olabilir. Aynı zamanda IIS üzerindeki bu nesnelerin tüm property'lerini de bu API sayesinde okuyabilir veya set edebiliriz. Bu makalemde bahsettiğim bu işlemleri C# ile nasıl yapabileceğimizi anlatacağım.

Bir konsol uygulaması oluşturarak başlayalım. Ardından da ilk olarak Microsoft.Web.Administration namespace'ini projeye referans ekleyelim. Bunun için bilgisayarımızdaki Windows dizinin altındaki System32\inetsrv klasöründeki Microsoft.Web.Administration.dll dosyasını seçiyoruz:

Ardından da koda aşağıdaki using ifadesini ekliyoruz:

using Microsoft.Web.Administration;

Artık yukarıda bahsettiğim işlemleri yapmaya hazırız. İlk olarak yeni bir site oluşturalım:

void createSite()
{
            ServerManager insServerManager = new ServerManager();
            insServerManager.Sites.Add("TestSite", @"C:\TestSite", 81);
            insServerManager.CommitChanges();
}

ServerManager nesnesi IIS üzerindeki işlemleri yapabilmemizi sağlayan metod, property ve diğer nesnelere erişmemizi sağlayan temel class'tır. Bu yüzden bütün işlemleri yaparken ilk olarak bu class'ın bir instance'ını almamız gerekir. Instance aldıktan sonra ServerManager'ın Sites collection'ına Add metodunu çağırarak yeni site'ı ekliyoruz. Add metodunun 4 overload'ı bulunuyor, biz örnekteki overload'da ilk olarak site'ın adını, yolunu ve port numarasını verdik. Ardından da bu işlemlerin tamamlanması için CommitChanges metodunu çağırdık. Kodu derleyip çalıştırdığımızda Windows 7'nın güvenlik kontrollerinden dolayı aşağıdaki hatayı alacağız:

Bu hatanın nedeni redirection.config dosyasının bulunduğu klasöre (Windows\System32\inetsrv\config) sadece administrator yetkilerinde bir kullanıcının erişebiliyor olması. Kodu çalıştıran kullanıcı eğer admin değilse default olarak bu klasöre erişim yetkisi bulunmamakta. Bu hatayı almamak için iki seçeneğiniz bulunuyor. Bunlardan birincisi administrator yetkilerinde bir kullanıcıyı impersonate ederek klasöre erişmek, diğeri ise bu klasöre read yetkisi olan bir kullanıcı oluşturup, bu kullanıcıyı impersonate edip klasöre onun yetkileriyle erişmek. İkinci yol daha güvenli olacaktır.

Gerekli düzenlemeleri yaptıktan sonra kodu çalıştırdığımızda TestSite adlı yeni site'ımızın oluştuğunu IIS Manager üzerinden görebiliriz:

Şimdi de IIS üzerindeki tüm site'ları listeleyelim:

void getListOfSites()
{
            ServerManager insServerManager = new ServerManager();
            foreach (Site insSite in insServerManager.Sites)
            {
                Console.WriteLine("--------------------");
                Console.WriteLine("Site Name: " + insSite.Name);
                Console.WriteLine("State:" + insSite.State);
                Console.WriteLine("Application Pool:" + insSite.ApplicationDefaults.ApplicationPoolName);
            }
}

Yine ilk iş ServerManager'ın instance'ını aldık. Microsoft.Web.Administration namespace'inin Site nesnesini taşıyan bu collection'da foreach ile dönerek Name, State, ApplicationPoolName property'lerini ekrana yazdırdık:

Oluşturduğumuz TestSite'ı stop etmek istersek de aşağıdaki kodu yazmamız yeterli olacaktır:

void stopSite()
{
            ServerManager insServerManager = new ServerManager();
            insServerManager.Sites["TestSite"].Stop();
            //insServerManager.Sites["TestSite"].Start();
}

Biraz önce bahsettiğim Site nesnesinin Stop metodu ile site'ı durdurabilir, Start metodu ile tekrar başlatabilirsiniz. Şimdi de oluşturduğumuz TestSite'a TestApp adında bir application ekleyelim:

void addApplication()
{
            ServerManager insServerManager = new ServerManager();
           
insServerManager.Sites["TestSite"].Applications.Add("/TestApp", @"C:\TestApplication");
            insServerManager.CommitChanges();
}

Site nesnesinin Applications collection'ınına Add metodu ile ilk parametresi adı, ikinci parametresi path'i olmak üzere yeni application'ı ekledik Uygulamayı çalıştırdığımızda IIS'de yeni application'ı görebiliriz:

Şimdi de yeni oluşturduğumuz TestApp application'ıına yeni bir virtual directory ekleyelim:

void addVirtualDirectory()
{
            ServerManager insServerManager = new ServerManager();
            insServerManager.Sites["TestSite"].Applications["/TestApp"].VirtualDirectories.Add("/TestVirtualDir", @"C:\TestVirtualDirectory");
            insServerManager.CommitChanges();
}

Son olarak da bir application pool'u nasıl recycle edebileceğimize bakalım:

void recycleApplicationPool()
{
            ServerManager insServerManager = new ServerManager();
            insServerManager.ApplicationPools["DefaultAppPool"].Recycle();
}

Işıl Orhanel
www.isilorhanel.net

 

OrnekUygulama