Makale Özeti

IIS 7 ile birlikte Microsoft IIS Yönetici konsolunda radikal değişiklikler yaptı. Eskisi gibi sabit, sadece Microsoft destekli bir yönetim konsolu kabuğundan sıyrılarak genişletilebilir ve arkasında topluluk desteği olan bir yönetim konsolu haline geldi. Bu makalemde sizlere IIS 7 yöneticis konsoluna nasıl yeni bir modül ekleyebileceğinizi anlatıyorum.

Makale

IIS 7 ile birlikte Microsoft IIS Yönetici konsolunda radikal değişiklikler yaptı. Eskisi gibi sabit, sadece Microsoft destekli bir yönetim konsolu kabuğundan sıyrılarak genişletilebilir ve arkasında topluluk desteği olan bir yönetim konsolu haline geldi. Bu sayede 3. parti geliştiriciler piyasa ihtiyaçları doğrultusunda IIS yönetim konsolu eklentileri çıkartabilmekte, özel kurumlar kendi eklentilerini kullanmakta.

Bu makalemde sizlere IIS 7.0’dan itibaren bizlere sunulan bu yeni IIS yönetim konsolu eklenti yapısını anlatarak C# ile nasıl kendi eklentilerinizi geliştirebileceğinizi paylaşacağım.

İsterseniz öncelikle IIS yönetici modül bileşenlerini tanıyalım. IIS yöneticisi modülleri en basit şekliyle aşağıdaki 3 temel parçadan oluşmaktadır;

  • Modül : Kendi yazdığımız IIS yönetici modülün giriş noktası olan modül sınıfı Microsoft.Web.Management.Client.Module sınıfından türemelidir. Bu sınıf, modülümüz içerisindeki gerekli ilklendirmeleri, modül arayüzünün kaydını v.b. işlemlerimizi yapabileceğimiz bir giriş noktası olacaktır. Bu işlemlerinizi yapmak için en uygun yer Module sınıfından gelen Initialize fonksiyonudur.
  • Modül Sağlayıcısı : Modülümüz hakkında bazı temel bilgileri verebilmemizi sağlayan modül sağlayıcısı sınıfı Microsoft.Web.Management.Server.ModuleProvider sınıfından türemelidir. Bu sınıf içerisinde modülümüzü, hangi seviyede IIS yöneticisinde işlem yapacağını (uygulama, site, sunucu gibi), modül sağlayıcımızla ilişkilendirilmiş modül hizmetimizi belirtebiliriz.
  • Modül Sayfası : Modülümüzün arayüzünü, dolayısıyla da pek çok fonksiyonalitesi sunan modül sayfası Microsoft.Web.Management.Client.Win32.ModulePage sınıfından türemelidir. Modülümüzün kullanıcıyla etkileşimini sağlayan modül sayfası aslında bir Windows Forms sınıfıdır dolayısıyla aynı bir masaüstü uygulamasında olduğu gibi arayüz bileşenleri kullanılabilir.

Pek çok IIS yöneticisi modülü yukarıdaki 3 temel bileşeni kullanmakla birlikte IIS yöneticisini genişletebilmek için bize sunulan başka bileşenlerde bulunmaktadır. Yukarıdaki bileşenlerden yola çıkarak basit bir modül yazacağımız bu makalem dışında takip eden makalelerde diğer bileşenlere de değinmeye çalışacağım.

IIS yöneticisi, tanımlı modüller hakkında ilk bilgiyi Administration.config dosyasında bulmaktadır. Bu dosya içerisinde yer alan moduleProviders bölümü altında modül isimleri ve bu modüllerin giriş noktası olan sınıfları listelenmetedir. IIS yönetici konsolu listelenen modülleri reflection kullanarak yüklemektedir. Bir modülün yüklenebilmesi için mutlaka GAC’ta bulunmalıdır.

Modülümüzü oluşturmak için işe Visual Studio’da yeni bir sınıf kütüphanesi (Class Library) oluşturarak başlayacağız;

Yeni Sınıf Kütüphanesi

Projemizde IIS 7 yonetici modülü oluşturabilmek için yukarıda bahsetmiş olduğum Microsoft.Web.Management.Client.Module, Microsoft.Web.Management.Server.ModuleProvider, Microsoft.Web.Management.Client.Win32.ModulePage gibi sınıfları projemizde kullanarak bunlardan türetilen sınıflar oluşturabilmek için projemizde Microsoft.Web.Management.dll assembly referansı bulunmalı. Referansını ekleyeceğiniz bu dll %WINDIR%\system32\inetsrv klasörü altında (örneğin; c:\Windows\system32\inetsrv) bulunabilir. Bu dll yeni bir IIS 7 yöneticisi modülü oluştururken ihtiyacımız olacak tüm sınıfları barındırmaktadır. Ek olarak; bir modül sayfası da tasarlayacağımız için kullanacağımız arayüz sınıflarının bulunduğu ve projemizin türünün sınıf kütüphanesi olması nedeniyle varsayılan olan gelmeyen System.Windows.Forms.dll’de proje referanslarına eklenmeli.

Projemizi oluşturup ihtiyacımız olan referansları ekledikten sonra kodlamaya geçmeden önce yerine getirmemiz gereken bir kaç adımımız daha var. Yukarıda bahsettiğim gibi IIS yöneticisi modülleri GAC’tan bularak yüklemekte. Projemizin derlendikten sonra GAC’a atabilmek için öncelikle imzalanmış olması gerekmekte. Projeyi imzalamak için proje özellikleri sayfasında yer alan Signing segmesinde imzada kullanılacak olan anahtarı belirtmeliyiz. Projemizde önceden oluşturduğumuz bir anahtar var ise bunu kullanabileceğimiz gibi yeni bir tane de oluşturup kullanabiliriz.

AnahtarOlustur

Proje dll'ini mzalama

Assembly’mizi imzalamak için gerekli anahtar dosyasını verdikten ve projemizi derledikten sonra Visual Studio komut satırından aşağıdaki komut yardımıyla assembly’mizi GAC’a atabiliriz;

gacutil.exe /if <DLL’imizin Adı>

Her derlememiz sonrası test edebilmek için bu komutu çalıştırmamız gerekli, aksi takdirde değişikliklerimizi IIS yönetici konsolunda göremeyiz. Bu işi her derleme sonrasında elle yapmak yerine otomatikleştirmek işimizi kolaylaştıracaktır. Otomatikleştirmek için projemizin özellikler penceresinde Build Events segmesine gelerek “Post-build event command line” bölümüne aşağıdaki komutları yazmamız yetecektir.

call "%VS100COMNTOOLS%\vsvars32.bat" > null
gacutil.exe /if "$(TargetPath)"

Post-build evet command line

İlk satır Visual Studio araçlarının bulunduğu dizin bilgilerini, ortam değişkenlerini hazırlayan batch dosyasını çalıştıracaktır, takip eden ikinci satır ise derlenen assembly’nizin GAC’a atılması için gerekli kod çalışacaktır. Bizim yerimizi her başarılı derleme sonrasında çalışacak olan bu komutu Visual Studio 2010 yerine alt sürümlerinde kullacaksanız %VS100COMNTOOLS% bölümü yerine aşağıdaki tablodan kullandığımız Visual Studio sürümüne uygun olan değeri yazmanız gerekli.

Visual Studio sürümü Kullanılacak değer
Visual Studio 2010 %VS100COMNTOOLS%
Visual Studio 2008 %VS90COMNTOOLS%
Visual Studio 2005 %VS80COMNTOOLS%

Son olarak modülümüz IIS yöneticisi içerisinde çalışırken Visual Studio ile debug edebilmemiz için proje özelliklerinde debug segmesinde aşağı görülen değerleri vermeliyiz;

Debug Ayarları

Alan Değer
Start External Program %windir%\system32\inetsrv\InetMgr.exe
Working Directory %windir%\system32\inetsrv

Bu değerler, Visual Studio’nun modülümüzü debug ederken öncelikle IIS yöneticisini (InetMgr) başlatmasını ve ardından da debugger’ın IIS yöneticisine bağlanarak debug yapabilmemizi sağlayacaktır.

Modülümüzün ilk derlenmesi ve GAC’a atılması sonrası IIS yöneticisine tanıtılması gereklidir. Bunun için yukarıda da bahsettiğim gibi Administration.config dosyasına girdi eklememiz gerekir. %WINDIR%\system32\inetsrv\config  klasörü altında bulabileceğiniz bu dosyayı açarak moduleProviders elementi altına kendi modülümüze ait aşağıdaki girdiyi eklemeliyiz;

<add name="OrnekModulSaglayicisi" type="Enterprisecoding.IISManagerModule.OrnekModulSaglayicisi, Enterprisecoding.IISManagerModule,  Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc2c6213715f3b51" />

 Administrator.Config moduleProviders

type özniteliğine verilecek değer OrnekModulSaglayicisi sınıfının assembly qualified adı olmalıdır. Bu alanda kullanacağınız PublicKeyToken (Genel Anahtar Simgesi) değerini GAC klasörüne (%WINDIR%\system32) giderek bulabilirsiniz. GAC klasöründe assembly’nizi bularak sağ tıklama menüsünden özellikler yardımıyla açılan dialogta Genel Anahtar Simgesi başlığı ile verilen değeri kullanmalısınız.

GAC Genel Anahtar Simgesi 

İkincil iş olarak aynı dosya içerisinde yer alan modules elementi altına da aşağıdaki satırı eklemeliyiz;

<add name="OrnekModulSaglayicisi" />

Administrator.Config modules

Bu adımlar sonrası artık ortamımız projemizi geliştirmek için hazır olacaktır. Geliştirmeye modül sağlayıcımızı oluşturarak başlamalıyız. Yazımın başında da bahsettiğim gibi, modül sağlayıcısı modülümüzü giriş noktası olacak ve modülümüz hakkında temel bilgileri sunacaktır.

Modül sağlayıcımızı oluşturmak için projemize Microsoft.Web.Management.Server.ModuleProvider  sınıfında türeyen yeni bir sınıf eklemeli GetModuleDefinition, SupportsScope gibi metodlarının içerisini gerekli bilgilerle doldurmalıyız. Aşağıda en basit şekliyle bir modül sağlayıcısını bulabilirsiniz.

public class OrnekModulSaglayicisi : ModuleProvider {
public override Type ServiceType {
get { return null; }
}

public override ModuleDefinition GetModuleDefinition(IManagementContext context) {
return new ModuleDefinition(Name, typeof(OrnekModul).AssemblyQualifiedName);
}

public override bool SupportsScope(ManagementScope scope) {
return true;
}
}

OrnekModulSaglayicisi sınıfı içerisindeki GetModuleDefinition metodu IIS yöneticisine modülümüz hakkında bilgi vermemizi sağlayacaktır, modülümüzün adı ve modülümüzün tanımlandığı sınıfın tam adını burada belirtmeliyiz. Bu örnekte, birazdan detaylarını paylaşacağım, OrnekModul sınıfı ile bir modül tanımladığımız için IIS yöneticisine bu sınıfın tam adını bildiriyoruz.

SupportsScope ise modülümüzün hangi seviyede aktif olduğunu belirtmemizi sağlayacaktır. Uygulama, site, sunucu gibi farklı düzey ve kombinasyonlarda tanımlayabileceğimiz modülümüz varsayılan olarak true döndüğümüzden dolayı bu örnek için tüm düzeylerde aktif olacaktır. Kullanıcı IIS yöneticisinde farklı düzeylere geçtikçe bu metod çağrılarak modülümüzün gösterilip gösterilmeyeceğine karar verilecektir. Modülün verilen düzeyde aktif olması için metod sonucunun true olması gereklidir. Örneğin modülümüzü sadece site düzeyince aktif olması için aşağıdaki gibi bir metod tanımlanmalıdır;

public override bool SupportsScope(ManagementScope scope) {
return true;
}

Modülümüze giriş noktasının sağlayıcı ile belirtmemiz ardından artık modülümüzün koduna geçebiliriz.

Modülü oluşturmak için projemize Microsoft.Web.Management.Client.Module sınıfında türeyen yeni bir sınıf eklemeli ve Initialize metodu içerisinde modülümüzü ilklendirmeliyiz. Initialize modülümüzün tanımlı olduğu düzey aktif olduğunda IIS yöneticisi tarafından çağırılarak modülümüzü gerekli hazırlıkları yapmasını sağlar. Aşağıda en basit şekliyle bir modül sınıfı bulabilirsiniz.

internal class OrnekModul : Module{
protected override void Initialize(IServiceProvider serviceProvider, ModuleInfo moduleInfo) {
base.Initialize(serviceProvider, moduleInfo);
MessageBox.Show("Örnek Modul ilklendiriliyor");
}
}

OrnekModulSaglayicisi sınıfımız IIS yöneticisi açıldığında oluşturulup GetModuleDefinition metodu çağrıldığında OrnekModul sınıfımız hakkında gerekli tanımlamaları oluşturup IIS yöneticisine dönecektir. Ardında OrnekModul sınıfı oluşturulacak ve ilklendirilmesi üzere Initialize metodu çağrılacaktır. Bu kodu derlemeniz sonrası IIS yöneticisini çağırdığınız karşınıza hemen "Örnek Modul ilklendiriliyor" yazılı bir dialoğun geldiğini göreceksiniz.

Şimdiye kadar yaptıklarımızla IIS yöneticisine entegrasyonda 3 önemli adımdan 2sini tamamlamış oluyoruz. Bir modül sağlayıcısı ile modülümüz hakkındaki bilgileri veriyor, modül sınıfı ile gerekli ilklendirmeyi yapıyor oluyoruz. 3. adımda ise asıl işimizi yaparak kullanıcı ile etkileşimi sağlayacağımız modül sayfasını oluşturmalı ve bu sayfanın IIS yöneticisine kaydını yapmalıyız.

Modül sayfamızı oluşturmak için projemize Microsoft.Web.Management.Client.Win32.ModulePage  sınıfında türeyen yeni bir sınıf oluşturmalıyız. Daha önceki iki sınıftan farklı olarak modül sayfası sınıfımızda kullanmak zorunda olduğumuz bir metod bulunmamakta. Modül sayfamız aynı bir windows forms tasarlar gibi forms bileşenleriyle tasarlayabilirsiniz. Aşağıda OrnekModulSayfasi sınıfımında üzerinden bir buton bulunan basit bir modül sayfası bulabilirsiniz.

internal class OrnekModulSayfasi : ModulePage /*Form*/ {
private Button ornekButton;

public OrnekModulSayfasi() {
InitializeComponent();
MessageBox.Show("Örnek Modul Sayfası ilklendirildi");
}

private void InitializeComponent() {
this.ornekButton = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// ornekButton
//
this.ornekButton.Location = new System.Drawing.Point(51, 38);
this.ornekButton.Name = "ornekButton";
this.ornekButton.Size = new System.Drawing.Size(92, 23);
this.ornekButton.TabIndex = 0;
this.ornekButton.Text = "Buraya basınız";
this.ornekButton.UseVisualStyleBackColor = true;
this.ornekButton.Click += new System.EventHandler(this.ornekButton_Click);
//
// OrnekModulSayfasi
//
this.Controls.Add(this.ornekButton);
this.Name = "OrnekModulSayfasi";
this.ResumeLayout(false);

}

private void ornekButton_Click(object sender, System.EventArgs e) {
MessageBox.Show("Butona basıldı");
}
}

Gördüğünüz gibi, bu sınıfı tasarlarken kolaylık olması adına forms’tan türetip işiniz bitince yeniden ModulPage’den türetebilirsiniz.

Modül Sayfası Tasarımı

Bu son adım ardından artık modülümüzü test edebiliriz. Başlat menüsünde yer alan çalıştır yardımıyla yada windows tuşu + R kombinasyonuyla açılan çalıştır diyaloğuna InetMgr yazarak IIS yöneticisini açabilirsiniz. Aşağıdaki resimde de gördüğünüz gibi giriş sayfasında Örnek Sayfa başlığıyla modülümüz için bir buton oluşturulmuş durumda. Bu butona bastığımızda modülümüzün ilklendiğini göstermek için kullandığımız mesaj diyalogu görülecektir.

IIS Giriş Sayfası

Diyalogu kapattığınızda bu defa da karşımıza eklediğimiz butonuyla örnek sayfamız gelecektir. Butona bastığımızda da eklediğimiz mesaj diyalogu gelecektir.

Örnek Modül Sayfası

Bu noktadan sonra elimizde ilk çalışan IIS yönetim modülümüz olacak. Bu noktadan yola çıkarak ihtiyaçlarımız doğrultusunda IIS yöneticisi API’lerini kullanarak yeni modüller ekleyebilirsiniz.

Fatih Boy

http://www.enterprisecoding.com
http://twitter.com/fatihboy