Eğer bir servis sağlayıcı isek iis üzerinde çok fazla değişiklik yapmak zorunda kalırız. Bazı durumlar da müşteriler virtual directory oluşturma ihtiyacı duyabiliyor. Bunun için sürekli servis sağlayıcı ile irtibat halinde olmaması ve iş yükü çıkarmaması için kullanıcılara bir arayüz ile kendi virtual directory’lerini kendilerinin oluşturmalarını sağlayabiliriz. İşte bunun için .net framework bize System.DirectoryServices namespace’ni sunuyor.
System.DirectoryServices
System.DirectoryServices(SDS), active directory gibi dizinlere programatik olarak erişmeyi sağlayan .net framework kütüphanesidir. Örneğin iis üzerinde açtığımız bir web sitesi yada virtual directory’yi bu namespace ile programatik olarak kolayca yapabiliriz.
Sınıfımız ile ön bilgiyi aldıktan sonra konu ile ilgili bir örnek yapalım. İlk olarak iis üzerinde bir site açıp daha sonra da bu site üzerinde virtual directory açacağız.
Örnek
Örneğimiz için yeni bir web site oluşturalım. Daha sonra projemize semDirectoryServices.cs isimli yeni bir class ekleyelim. Bu class aşağıdaki gibi olacaktır. Class’a geçmeden önce iis’i yapılandırmamızı sağlayan iis metabase dosyasını inceleyelim.
IIS Metabase Dosyası
Metatabanı, birçok IIS (Internet Information Services) yapılandırma değeri için depodur. Metatabanı düz metinli bir .XML dosyasıdır ve el ile veya programla düzenlenebilir. Ayrıca metatabanı çok verimli şekilde genişletilebilir. IIS dağıtımınız büyüdükçe metatabanınız da büyür; bununla birlikte bir devralma modeli kullanarak, yinelenen değerlerin açıkça bildirimi engellenerek, yapılandırma değerlerinin metatabanından okunması gerektiğinde oluşan iş yükü azaltılır.
|
semDirectoryServices.cs |
|
using System; using System.DirectoryServices;
public class semDirectoryServices { private string metabase = "IIS://Localhost/W3SVC"; //Kullanacağımız Metabase dosyası private string siteYolu; // Sitemizin bulunacağı yol private string siteID; // IIS Üzerinde sitemizin alacağı benzersiz ID private string siteAdi; // IIS üzerinde sitemize erişeceğimiz isim public string SiteID { get { return siteID; } set { siteID = value; } }
public string SiteAdi { get { return siteAdi; }set { siteAdi = value; } }
public string SiteYolu { get { return siteYolu; } set { siteYolu = value; } }
public string SiteOlustur()// Bu fonksiyon ile IIS üzerinde bir site açacağız. { try { DirectoryEntry Servis = new DirectoryEntry(metabase); string className = Servis.SchemaClassName.ToString(); DirectoryEntries Siteler = Servis.Children; DirectoryEntry YeniSite = Siteler.Add(siteID, (className.Replace("Service", "Server"))); YeniSite.Properties["ServerComment"][0] = siteAdi;//Açılacak sitenin adı. YeniSite.CommitChanges();
DirectoryEntry YeniDizin; YeniDizin = YeniSite.Children.Add("Root", "IIsWebVirtualDir");//Root Dizine Yeni bir site ekliyoruz YeniDizin.Properties["Path"][0] = siteYolu; // Host edilecek sitenin yolunu belirliyoruz. YeniDizin.Properties["AccessScript"][0] = true; YeniDizin.CommitChanges(); DirectoryEntry path = new DirectoryEntry(metabase + "/" + siteID);
PropertyValueCollection propValues = path.Properties["ServerBindings"]; path.Properties["ServerBindings"].Value = ":8080:"; // Sitenin çalışacağı başlantı noktasını belirliyoruz. path.CommitChanges(); return "Web Sitesi Başarıyla Oluşturuldu !";
}
catch (Exception Ex) { return "Bir Hata Meydana Geldi :" + Ex.Message; } } } |
Class ile işimiz şimdilik bu kadar. Şimdi kullanıcı ara yüzüne geçebiliriz. Formumuz üzerine;
5 adet label,
3 Textbox ve
1 Button ekleyelim.

Benim hazırladığım görüntü yukarıdaki gibidir. Şimdi buton üzerine tıklayıp sitemizi oluşturacak kodları yazalım.
|
Button Click Eventi |
|
protected void btnSiteOlustur_Click(object sender, EventArgs e) { semDirectoryServices sds = new semDirectoryServices(); sds.SiteID = txtSiteID.Text; sds.SiteAdi = txtSiteAdi.Text; sds.SiteYolu = txtDosyaYolu.Text; lblUyari.Text = sds.SiteOlustur(); } |
Şimdi yazdığımız kodu test edelim.

Evet, uyarı olarak başarıyla oluşturuldu dedi ama emin olmak için ilk olarak iis’e gidip bakalım gerçekten de eklendi mi?

IIS’de eklenmiş J Şimdi yazgelistir.com sitesi üzerinde sağ tıklayarak göz at seçeneğine tıklayalım.

Gerçekten de çalışıyormuş J
Şimdi bu siteye birde virtual directory ekleyelim. Bunun için Classs’ızın içine aşağıdaki kodları ekleyelim.
|
semDirectoryServices.cs - Ek |
|
public string VirtualDirectoryOlustur() { try { string vdMetabase = metabase + "/" + siteID + "/root"; DirectoryEntry site = new DirectoryEntry(vdMetabase); string className = site.SchemaClassName.ToString(); if ((className.EndsWith("Server")) || (className.EndsWith("VirtualDir"))) { DirectoryEntries vdirs = site.Children; DirectoryEntry YeniVirtualDirectory = vdirs.Add(siteAdi, (className.Replace("Service", "VirtualDir"))); //Sitemize virtual directory ekliyoruz YeniVirtualDirectory.Properties["Path"][0] = siteYolu; // Virtual directorynin host edileceği dosya yolu YeniVirtualDirectory.Properties["AccessScript"][0] = true; YeniVirtualDirectory.Properties["AppFriendlyName"][0] = siteAdi; // Virtual directory adı YeniVirtualDirectory.Properties["AppIsolated"][0] = "1"; YeniVirtualDirectory.Properties["AppRoot"][0] = "/LM" + vdMetabase.Substring(vdMetabase.IndexOf("/", ("IIS://".Length))); YeniVirtualDirectory.CommitChanges(); } return "Virtual directory Başarıyla Oluşturuldu !"; }
catch { return "Bir Hata Meydana Geldi !"; } } |
Oluşturduğumuz forma bir adet daha Button ekleyelim. Bu buton altında da daha önce oluşturduğumuz siteye yeni bir virtual directory ekleyeceğiz.
|
vdOlustur Butonu Click Eventi |
|
protected void vdOlustur_Click(object sender, EventArgs e) { semDirectoryServices sds = new semDirectoryServices(); sds.SiteID = txtSiteID.Text; sds.SiteAdi = txtSiteAdi.Text; sds.SiteYolu = txtDosyaYolu.Text lblUyari.Text = sds.VirtualDirectoryOlustur(); } |
Hemen test edelim J

Evet oluşturuldu dedi ama birde iis’den bakalım.

İşte budur J
Bu makalenin de sonuna geldik. Bir sonraki makale de görüşmek üzere. İyi çalışmalar dilerim
Sem Göksu
MCP | MCAD.NET |MCTS
sem.goksu@yazilimgunlugu.com
www.semgoksu.com | www.yazilimgunlugu.com
Kaynaklar
http://msdn.com