AppFabric Extensions Preview Release is Out

27. July 2010

Its an important day for AppFabric Extensions project. Initial setup script is finally ready and first preview is published for community review.

Please find preview release at http://appfabricextensions.codeplex.com/releases/view/49706

Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

English, AppFabric Extensions

Windows Server AppFabric Management Extensions is Out

18. July 2010

First code bits of my project Windows Server AppFabric Management Extensions is out at CodePlex. You can visit project page at http://appfabricextensions.codeplex.com/

Currently it has cache allowed account management module embedded into IIS Manager; more to come…

image 

image

 

Application setup is on the way; but source code can be download and compile from CodePlex project site. By the way; English and Turkish localizations are build in provided.

Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

AppFabric

IIS Express : Biraz Cassini, Biraz IIS

4. July 2010

Geçtiğimiz haftaya kadar asp.net geliştiriciler için geliştirme sürecinde sadece iki web sunucuyu yer almaktaydı:

  • Visual Studio aile ile birlikte gelen ASP.Net geliştirme sunucusu
  • Windows işletim sistemi ile birlikte gelen Internet Information Server (IIS)


Her iki sunucunun da kendine göre artıları ve eksileri bulumaktaydı; fakat özellikle Visual Studio ile birlikte gelen Asp.Net geliştirme sunucusu, Cassini’nin devamı da diyebiliriz, yazılım geliştiricilr tarafından sıklıkla tercih edilmekteydi. Kolaylıkla bir klasörün host edilebildiği ve oldukça “light” olan bu sunucu malesef ki bu özellikleri yanında bazı dezavantajlara da sahip.

Aslında, yakından bakılacak olursak, Asp.Net geliştirme sunucusu tam bir web sunucu sayılmayacaktır. En basitinden SSL ya da url yeniden yazma gibi özellikleri barındırmamakta. İleri düzey asp.net uygulamaları geliştiriyorsanız bu eksiklikler IIS’i tercih etmenize neden olacaktır.

Öte yandan IIS’e bakacak olursanız, tam bir web sunucusudur (hatta son eklentiler ardında koşar adım bir uygulama sunucu olma yolundadır da diyebiliriz); fakat giderek artan bir karmaşıklığa sahiptir ve kullanımında en azından giriş düzeyinde bilgi sahibi olunmalıdır. Üstelik daha yönetim konsolunun açılması noktasında dahi sistem yöneticisi yetkisi istemektedir; ki bazı durumlarda büyük kurumlar için sıkıntı sebebi olmaktadır.

Microsoft, müşterilerinden gelen geri bildirimleri dikkate alarak bu iki sunucunun arasındaki boşluğu dolduracak yeni bir ürün yayınlıyor; IIS Express. Asp.Net geliştirme sunucunun kolaylığını ve IIS’in gücünü vaadeden IIS Express’in yayınlanmasını iple çekiyoruz. 10 MB gibi küçük bir kurulum dosyasıyla hızlıca kurulabilecek olan ve herhangi bir kayıt/yapılandırma gerektirmeyecek olan ürünün diğer öne çıkan özelliklerini şu şekilde sıralayabiliriz;

  • Visual Studio içerisinde debug yapmanıza olanak verecek olan bu ürün herhangi bir yönetimsel yetki gerektirmemekte
  • Aralarında SSL, Url yeniden yazma, Medya ve diğer IIS 7.x ailesi modüllerinin bulunduğu geniş web server özellikleri
  • IIS 7.x ailesinin desteklediği aynı genişleme modeli ve web.config dosya ayarları
  • Windows XP ve üzeri işletim sistemi desteği

 

Kurulumu ardından Visual Studio 2010 ile entegre şekilde çalışabilecek olan IIS Express kullanım kolaylığı açısında Asp.Net geliştirme sunucuna çok benzemekle birlikte bizlere daha çok seçenek sunacak.

Çok yakın zamanda beta sürümü yayınlanacak olan IIS Express ile bir klasörü sanal bir dizin olarak web sunucusu üzerinde barındırmak sağ tıklama menüsündeki bir seçenekle mümkün olacak.

Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

Türkçe, IIS

Üçüncü IE9 Platform Preview Yayınlandı

23. June 2010

Microsoft daha önce duyurduğu gibi düzenli olarak Internet Explorer 9 platform önizleme sürümlerini yayınlamaya devam ediyor. Daha önce ilk iki sürümü yayınlanmış olan Internet Explorer platform önizlemesinin üçüncü sürümü dün yayınlandı.

Özellikle canvas, video ve ses konusunda iyileştirmelere sahip olan 3. önizleme paralelde de Acid3 testlerindeki başarısını %68’den %83’e yükseltti. Yeni önizleme ile birlikte güncellenen WebKit SunSpider test sonuçlarına göre önceki sürümlere göre daha da hızlanmış bir önizleme karşımızda.

image

Yeni önizleme IE9 testdrive sitesinden herkes tarafından indirilerek test edilebilir.

Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

Türkçe

IIS 7 Yöneticisi Ağaç Hiyerarşisini Genişletme

19. June 2010

Bir önceki makalemde sizlerle IIS 7 yöneticisi genişletilebilir mimarisinden ve kendi modülünüzü nasıl ekleyebileceğinizden bahsetmiştim. IIS 7 genişletilebilirlik anlamında bize pek çok yöntem sunmakta ve bu makalemde bu sizlerle IIS7 yöneticisi ağaç hiyerarşisine nasıl yeni bir girdi ekleyebileceğinizi paylaşacağım.

Ağaç hiyerarşisine yeni bir girdi oluşturmak için en basit şekliyle aşağıda sıraladığım 3 temel parçacığa ihtiyaç olacaktır;

  • Hiyerarşi Servisi : Tüm IIS 7 yönetici hiyerarşisini yöneten Hiyerarşi Servisi sunduğu Select, Delete, Refresh v.b. metodlar sayesinde programsal olarak hiyerarşiye müdahale edilmesine olanak sunmaktadır. Arayüz tarafından bizlere bir örneği verilen bu servise ServiceProvider üzerinden ulaşılabilir.
  • Hiyerarşi Bilgisi : Ağaç üzerindeki bir düğümü temsil eden Hiyerarşi Bilgisi, temelde abstract olan Microsoft.Web.Management.Client.HierarchyInfo sınıfınden türetilen bir sınıftır. HierarchyInfo‘dan kalıtılmış metodlar yardımıyla alt düğümlerin bulunup bulunmadığı, düğümün adı gibi bilgileri verebilir ve seçildiğinde,silindiğinde ya da yeniden adlandırıldığında yapılacak olan işlemlerimizi yerine getirebiliriz.
  • Hiyerarşi Sağlayıcısı : IIS 7 Yöneticisi ağaç hiyerarşisini genişletmekte giriş noktanız olan Hiyararşi Sağlayıcısı, temelde abstract Microsoft.Web.Management.Client.HierarchyProvider sınıfından türetilen bir sınıftır. Ağaç hiyerarşisi oluşturulurken hiyerarşi servisi tüm kayıtlı hiyerarşi sağlayıcılarını dolaşarak ağacı oluşturur.

Konuyu pekiştirmek için yazımın devamında yer vereceğim örnek kodlar IIS 7 Yoneticisine Kendi Modulunuzu Eklemek başlıklı yazımında ele aldığım örnek projenin devamı olacaktır. Bu sebeple bir modülü IIS' yöneticisine nasıl kayıt edeceğiniz ve nasıl debug edebileceğiniz gibi ayrıntıları bildiğinizi yada bir önceki makalemi okuduğunuzu varsayıyorum.

Yukarıdaki teorik bilgi ışığında örnek kodumuzu yazmaya başlayalım. Oluşturacağımız ilk sınıf Hiyerarşi bilgisini verecek olan OrnekHiyerarsiBilgisi sınıf olacaktır.

internal class OrnekHiyerarsiBilgisi : HierarchyInfo {
    public OrnekHiyerarsiBilgisi(IServiceProvider serviceProvider) : base(serviceProvider) { }

    public override string NodeType {
        get { return "Enterprisecoding.IISManagerModule.Ornek"; }
    }

    public override bool SupportsChildren {
        get { return false; }
    }

    public override string Text {
        get { return "Ornek IIS Modülü"; }
    }

    protected override bool OnSelected() {
        return Navigate(typeof(OrnekModulSayfasi));
    }
}

HierarchyInfo  sınıfından türettiğimiz OrnekHiyerarsiBilgisi sınıfında atadan kalıtılan aşağıdaki özellik ve metodlar kullanılarak hiyerarşi servisince kullanılacak bilgiler verilmiştir.

  • SupportsChildren; bool türünden olan bu özellik hiyerarşi servisince düğümümüze bağlı alt düğümler bulunup bulunmadığının sorgulanması için kullanılmaktadır. Bu örnekte varsayılan olan döndüğümüz false değeri bağlı herhangi bir alt düğüm bulunmadığını belirtmektedir.
  • Text; string türünden olan bu özellik hiyerarşi servisinin düğümümüzü arayüzde hangi isimle göstereceğini belirtmek için kullanılır. Örneğimizde düğümümüz arayüzde "Ornek IIS Modülü" ismiyle gösterilecektir.
  • NodeType; string türünden olan bu özellik programsal olarak düğümümüzün hangi türde olduğunu belirtmek ve düğüm türüne göre işlem yapabilmek amacıyla kullanılır. Bu örnek için Enterprisecoding.IISManagerModule.Ornek değerine sahiptir. Bu özelliğe düğüm türünüzü belirten tekil herhangi bir string verilebilir.
  • OnSelected : IIS 7 yönetim konsolu üzerinden kullanıcının düğümümüzü seçmesi durumunda hiyerarşi servisince çağırılacak olan bu metod bize kendi iş mantığımızı çalıştırma imkanı sunmaktadır. Bu örnekte düğümümüz seçildiğinde IIS 7 yönetim konsolunda bir önceki makalemde oluşturduğumuz örnek modül sayfası gösterilecektir.

Bu özellikler ve metodlar dışında SupportsDelete ve SupportsRename özellikleri sayesinde düğümün silme ve yeniden adlandırma fonksiyonaliteleri olup olmadığını belirtebilir ve OnDeleting, OnRenamed, OnRenaming gibi metodlarla da bu fonksiyonaliteleri kontrol edebilirsiniz.

Oluşturacağımız bir diğer sınıf ise OrnekHiyerarsiBilgisi sınıf örneğini hiyerarşi servisine tanıtacağımız hiyerarşi sağlayıcısıdır.

internal class OrnekHiyararsiSaglayicisi : HierarchyProvider {
    public OrnekHiyararsiSaglayicisi(IServiceProvider serviceProvider)
        : base(serviceProvider) {
    }

    public override HierarchyInfo[] GetChildren(HierarchyInfo item) {
        if (item.NodeType == HierarchyInfo.ServerConnection) {
            return new HierarchyInfo[] { new OrnekHiyerarsiBilgisi(this) };
        }

        return null;
    }
}

Yukarıda mümkün olduğunca basit bir şekilde OrnekHiyararsiSaglayicisi sınıfı ile örneklediğim hiyerarşi sağlayıcısı HierarchyProvider sınıfında kalıtarak kullandığı GetChildren metodu ile hiyerarşi servisine gerekli hiyerarşi bilgilerini dönmektedir.

GetChildren metodu parametre olarak kabul ettiği hiyerarşi bilgisi yardımıyla hangi noktada bulunduğunu hiyerarşi servis sınıfından öğrenerek karar vermenizi sağlamaktadır. Yukarıdaki örnekte biraz önce oluşturduğumuz OrnekHiyerarsiBilgisi sınıfının sadece sunucu seviyesinde kullanıması sağlanmakta.

Hiyerarşi bilgisi ve hiyerarşi sağlayıcısı sınıflarını oluşturarak işin önemli bir kısmını tamamlamış oluyoruz. Bu noktada artık modülümüz içerisine giderek hiyerarşi sağlayıcısını tanıtmalıyız. Aşağıda bir önceki makalemde oluşturduğumuz OrnekModul sınıfı içerisinde yer alan initialize metodunu görebilirsiniz.

internal class OrnekModul : Module
{
    protected override void Initialize(IServiceProvider serviceProvider, ModuleInfo moduleInfo)
    {
        base.Initialize(serviceProvider, moduleInfo);

        // ....
        //modül ile ilgili yapılan diğer ilklendirme işlemleri
        // ....

        var extensibilityManager = (IExtensibilityManager)GetService(typeof(IExtensibilityManager));
        extensibilityManager.RegisterExtension(typeof(HierarchyProvider), new OrnekHiyararsiSaglayicisi(serviceProvider));

    }
}

Not; Hiyerarşi sağlayıcısını kayıt ettirdiğimiz bölüme odaklanabilmek için bir önceki makalemde  bahsetmiş olduğum bunun dışındaki bölümlere yer vermiyorum.

Gördüğünüz gibi hiyerarşi sağlayıcısını kayıt etmek bu kadar kolay.

Kodumuzu derledikten sonra IIS yöneticisi konsolunu açtığımızda sol tarafta yer alan ağaç içerisinde oluşturduğumuz düğümü görebilir, bu düğümü seçtiğimizde ise daha önceden oluşturduğumuz modül sayfasının açıldığını test edebiliriz.

IIS Yöneticisi Özelleştirilmiş Ağaç Düğümü

Şimdi de isterseniz bu düğümün menüsüne yeni girdiler eklemeye çalışalım. Hiyerarşi servisi bir düğüme sağ tıklandığında gösterilecek olan menüye ait girdileri ilgili hiyerarşi bilgisi sınıfında yer alan Tasks özelliği sayesinde bulur. TaskListCollection türünden olan bu özellikte eklenecek olan tasklar Microsoft.Web.Management.Client.TaskList sınıfından türetilmiş bir sınıf vasıtasıyla eklenebilir.

internal class OrnekHiyerarsiTaskListesi : TaskList {
    public override System.Collections.ICollection GetTaskItems(){
        var items = new ArrayList();

        var taskItem = new MethodTaskItem(
                            "MesajGoster",      // Metod Adı
                            "Mesaj Göster",     // Menüde görülecek text
                            "OrnekKategori");   // Kategori

        taskItem.Enabled = true;
        items.Add(taskItem);

        return items;
    }

    public void MesajGoster() {
        MessageBox.Show("Mesaj Göster'e butonuna basıldı");
    } 
}

Yukarıda yer alan ve TaskList’ten türetilmiş olan OrnekHiyerarsiTaskListesi sınıfında task tanımlaması GetTaskItems metodu içerisinde yapılmaktadır. Bu örnekte MethodTaskItem kullanılarak Mesaj Göster task’ı oluşturulmuştur. MethodTaskItem sınıfı oluşturulurken sırasıyla task’ın çalıştırılacağı metod adı, menüde gösterilecek text ve task’ın ait olduğu kategori adı verilmiştir. Verilen ilk parametre olan metod adı, task menüden seçildiğinde çalıştırılacak olan metodun adıdır. Parametresiz olması gereken bu metod ilgili sınıfta tanımlı olmalıdır. Yukarıdaki örnekte metod adı olarak MesajGoster verildiği ve bu metodun sınıf içerisinde tanımlandığı.

Özelleştirilmiş Ağaç Düğümü Menü

Örnekte, kullanıcı menüden Mesaj göster seçeneğini seçtiğinde MesajGoster metodu çalıştırılarak kullanıcıya "Mesaj Göster’e butonuna basıldı" mesajı gösterilecektir.

Bazı tasarımlarda, eklediğimiz menü nesnesinin kullanacağı metoda parametre geçmek isteyebiliriz. Örneğin; aynı metodu kullanan birden fazla menü nesnesinden hangisinin çağrıyı tetiklediğini bilmek. Bunu yapabilmek için MethodTaskItem sınıfı oluşturulurken kullanıcı verisi geçebileceğimiz constructer’ını kullanmamız yeterli olacaktır.

internal class OrnekHiyerarsiTaskListesi : TaskList {
    public override System.Collections.ICollection GetTaskItems() {
        var items = new ArrayList();

        var taskItem1 = new MethodTaskItem(
                            "MesajGoster",      // Metod Adı
                            "Mesaj Göster 1",   // Menüde görülecek text
                            "OrnekKategori",    // Kategori
                            "Mesaj gösterir",   // Tanımlayıcı bilgi
                            null,               // Menüdeki resmi
                            "Mesaj Göster 1");  // Parametre

        var taskItem2 = new MethodTaskItem(
                            "MesajGoster",      // Metod Adı
                            "Mesaj Göster 2",   // Menüde görülecek text
                            "OrnekKategori",    // Kategori
                            "Mesaj gösterir",   // Tanımlayıcı bilgi
                            null,               // Menüdeki resmi
                            "Mesaj Göster 2");  // Parametre

        taskItem1.Enabled = true;
        taskItem2.Enabled = true;

        items.Add(taskItem1);
        items.Add(taskItem2);

        return items;
    }

    public void MesajGoster(object message) {
        MessageBox.Show(string.Format("{0}'e basıldı", message));
    } 
}

MethodTaskItem sınıfının object olarak kullanıcı verisini kabul eden constructer’ı yardımıyla metoda geçmek istediğimiz veriyi belirtebiliriz. Yalnız dikkat edilmesi gereken nokta, bu kullanımda bir öncekinden farklı olarak çağırılacak olan metodun parametresiz değil object kabul eden tek parametreli bir metod olması gerekmektedir. Yukarıdaki örnekte görüldüğü gibi her iki menü nesnesi de aynı metodu kullanmakta, metod kendisine gönderilen parametre doğrultusunda hangi menü nesnesince çağrıldığını bilmekte.

Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

Türkçe, IIS ,

IIS 7 Yöneticisine Kendi Modülünüzü Eklemek

17. June 2010

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ınd 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 scope == ManagementScope.Site;
}

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.

Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

Türkçe, IIS

Windows 7 ve Windows Server 2008 R2 Beta Hizmet Paketleri

12. June 2010

Microsoft Tech.Ed 2010 Kuzey Amerika ilk gün key note’unda Windows 7 ve Windows Server 2008 R2 Service Pach 1 (Hizmet Paketi 1) hakkında duyuru yaptı. Hizmet paketlerinin temmuz ayı sonunda beta sürümü olarak yayınlanmasından kısa bir süre sonra da tam sürümünün yayınlanacağı açıklandı.

Windows Vista’nın büyük hayal kırıklığı ardından yayınlanan service pack’leri sonrasında nispeten daha tutarlı hale gelmesini hatırlayanlar Windows 7 service pack’le ne gibi değişikliklerin olacağını merakla beklemekte. Microsoft, Windows 7 SP1’le birlikte işletim sisteminde yeni eklenecek özellik olmayacağını ve bu paketin daha çok toplu ve tutarlı bir güncelleme şeklinde olacağını açıkladı.

Windows 7 hizmet paketinden farklı olarak Windows Server 2008 R2 hizmet paketinde toplu ve tutarlı güncellemeler yanında yeni özellikler de gelmekte. Yeni özellikler arasında Windows Server Hyper-V’ye eklenen dinamik hafıza (dinamik olarak, çalışan sanal makinelere ayrılan hafızaların yönetilmesi/değiştirilmesi) ve Microsoft RemoteFX (Uzak Masaüstü oturumu kullanıcı deneyimi bir üst seviyeye çıkartmakta ve RDP teknolojisi üzerine kurulu) sayılabilir.

Özellikle büyük kurumsal müşterilerin yeni işletim sistemine geçmeden önce genellikle ilk hizmet paketinin yayınlanmasını beklediklerini düşünecek olursak, Windows 7 SP1’in yayınlanması sonrasında kurumsal oyunculardan da Windows 7’ye önemli geçişler yaşanacaktır.

Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

Türkçe, Windows

Windows Server AppFabric Yayınlandı

8. June 2010

Uzun bir maratonun ardından nihayet Windows Server AppFabric yayınlandı. Kısa bir süre önce RC sürümü yayınlanmış olan Windows Server AppFabric son sürümüyle birlikte artık üretim ortamlarında kullanılabilir durumda.

Güncel sürümü buradan indirip kurabileceğiniz gibi Web Platform Installer üzerinden de kurabilirsiniz. RC sürümüyle birlikte Türkçe desteği olan Windows Server AppFabric’in son sürümüne ait kurulum kılavuzunu burada bulabilirsiniz.

Windows Server AppFabric güncellemelerini bu adresten indirip kurmanızı tavsiye ederim.

Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

Türkçe, AppFabric

Visual Studio 2010 Pul Önizleme Özelliğini Açmak

7. June 2010

Visual Studio 2008 içerisinde Ctrl+Tab tuş kombinasyonunu kullananlar Visual Studio 2010 RTM sürümünde pul önizlemelerinin (Thumbnail Preview) eksikliğini hissedeceklerdir. Pul önizlemeler, Ctrl+Tab tuş kombinasyonun aktif segme listesinin listelendiği pencerenin sağ köşesinde yer alan ve seçili segmeye ait küçük bir önizleme görüntüsü sunan faydalı bir özelliktir.

Bu özellik Visual Studio 2010’da da RTM sürümü öncesinde aktif olmasına karşın RTM sürümününün çıkmasının arifesinde kapatılmıştır. Kapatılma sebebi ise; özellikle netbook gibi düşük konfigurasyonlu GPU bulunduran donanımlarda Ctrl+Tab kullanımında önemli yavaşlamalara sebep olmasıydı.

ShowThumbnailsOnNavigation özelliği açılmadan önce

Masaüstü bilgisayarları gibi daha iyi donanıma sahip sistemlerde bu özelliğin kullanılmak istenebileceğini düşünen Visual Studio geliştiricileri özelliği tamamen kaldırmak yerine kayıt kütüğündeki bir anahtar yardımıyla gizlemeyi tercih etmişler. Bu özelliği açmak isterniz başla münüsünde çalıştır’a (Win+R) aşağıdaki satırı yazarak enter tuşuna basmanız yeterli. Üstelik özelliğin aktif olması için Visual Studio’nun yeniden başlatılmasına da gerek yok.

ShowThumbnailsOnNavigation özelliği açıldığında

reg ADD HKCU\Software\Microsoft\VisualStudio\10.0\General /v ShowThumbnailsOnNavigation /t REG_DWORD /d 1

Bu özelliği kapatmak için ise aşağıdaki komutu kullanmalısınız (eski değerin üzerine yazacaktır);

reg ADD HKCU\Software\Microsoft\VisualStudio\10.0\General /v ShowThumbnailsOnNavigation /t REG_DWORD /d 0
Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

Türkçe, Visual Studio

C# ile Windows Server AppFabric Önbellek Etkileşimi

6. June 2010

Daha önceki makalelerimde sizlerle Windows Server AppFabric’in nasıl kurulacağını, geliştirme ortamının nasıl hazırlanacağını paylaşmıştım. Bu makalemde ise C# ile Windows Server AppFabric önbelleğiyle nasıl etkileşimde bulunacağınızı paylaşacağım.

Önbelleği kullanmaya başlamadan önce Sistem yöneticisi ile görüşerek Windows Server AppFabric Önbellek hizmetinin kurulu olduğu sunucuları ve bu sunuculardaki önbellek portunu öğrenmelisiniz. Makalemin geri kalanında Windows Server AppFabric önbellek kümesinin yerel makinenizde 22233 portu üzerinden hizmet veren tek bir sunucu ile hizmet verdiği varsayımıyla örnekleme yapacağım.

C# ile bir önbellek kümesine bağlanmak için öncelikle bir yapılandırma sınıfı (DataCacheFactoryConfiguration) oluşturmalı ve bu sınıf içerisinde en az bir önbellek kümesi üyesi önbellek sunucusu belirtmelisiniz.

var yapilandirma = new DataCacheFactoryConfiguration();
yapilandirma.Servers = new[] { new DataCacheServerEndpoint("localhost", 22233) };
yapilandirma.LocalCacheProperties = new DataCacheLocalCacheProperties();

Yukarıda da belirttiğim gibi burada en az bir önbellek sunucu bilgisi verilmesi yeterlidir. Windows Server AppFabric önbellek kütüphanesi arka planda bu bilgiyi kullanarak önbellek kümesine bağlanmakta ve kümedeki tüm önbellek sunucularının bilgilerini almaktadır. Yüksek erişilebilirlik gerektiren bir uygulama geliştiriyorsanız size tavsiyemse burada kümenizde bulunan mümkün olduğunca fazla sunucunun bilgisini vermeniz; çünkü tek sunucu bilgisinin verildiği senaryolarda ilk bağlantı sırasında bu sunucunun erişilemiyor olması halinde kümedeki diğer sunucular ayakta olsa bile uygulamanız onlardan haberdar olmadığı için kullanılamayacaktır.

Yukarıdaki kod satırları sonrasında geriye kümeye bağlanmak için yapmanız gereken tek satır kod kalıyor; önbellek fabrikasının oluşturulması.

var onbellekFabrikasi = new DataCacheFactory(yapilandirma);

Bu kod ile birlikte uygulamanı kümeye bağlanacak ve bu önbellek fabrikası üzerinden isteğiniz belleğe erişebileceksiniz. Kime geliştirme/üretim ortamlarında yukarıdaki kodlar işletilirken aşağıdaki hata ile karşılaşabilirsiniz;

ErrorCode<ERRCA0017>:SubStatus<ES0006>:Geçici bir hata var. Lütfen daha sonra yeniden deneyin. (Belirtilen Önbellek sunucularından biri veya birden fazlası, ağın ya da sunucuların meşgul olması nedeniyle kullanılamıyor. Kümede bu istemci hesabına güvenlik izni verildiğinden ve tüm önbellek konaklarında güvenlik duvarı aracılığıyla AppFabric Önbelleğe Alma Hizmeti'ne izin verildiğinden emin olun. Daha sonra yeniden deneyin.)

Genelde yazılımcının unutkanlığından kaynaklanan bu hatayı aldığınızda öncelikle önbellek hizmetinin çalıştığından emin olun. Hizmetin çalışmıyor olması durumunda sistem yöneticisi olarak başlatılan PowerShell oturumunda (Başlat menüsü –> Windows Server AppFabric –> Önbelleğe Alma Yönetimi Windows PowerShell) aşağıdaki komut ile önbellek kümesini başlatmalısınız;

start-cachecluster

Önbellek kümesi çalışıyor olmasına rağment bu hatayı alıyorsanız önbellek kümesine erişim yetkiniz olmayabilir. Bu durumda uygulamayı çalıştıran kullanıcının/makinenin önbelleğe erişim yetkisi olup olmadığı aşağıdaki Windows Server AppFabric PowerShell komutu ile kontrol edilmeli;

Get-CacheAllowedClientAccounts

Eğer bu komutun çalıştırılması sonucu gelen liste içerisinde kullanıcı/makine yer almıyorsa aşağıdaki komut vasıtasıyla önbellek kümesine erişim yetkisi verilmelidir;

Grant-CacheAllowedClientAccount [KULLANICI ADI]

Önbellek kümesi erişim yetkisi ile ilgili sıkıntıları çözdükten sonra aşağıdaki komut ile varsayılan önbellek alınarak üzerinde işlem yapılabilir.

var onbellek = onbellekFabrikasi.GetDefaultCache();

Tabi ki işlemlerinizi varsayılan önbellek dışında bir başka önbellek üzerinde de gerçekleştirebilirsiniz. Bu durumda kodumuz aşağıdaki gibi olmalıdır;

var onbellek = onbellekFabrikasi.GetCache("[ÖNBELLEK ADI]");

Yukarıdaki her iki kod parçacığına da performans açısında bakacak olursak; önbelleği bir önbellek fabrikasından almak maliyetli bir iştir. Bu sebeple de her ihtiyaç duyulduğunda önbellek fabrikasından bir örneğini almak yerine bir defa alarak bunu bir değişken içerisinde saklamak ve gerektiğinde bu değişken üzerinden işlem yapmak daha doğru olacaktır.

Önbellek’e erişmek için onbellek nesnemizi oluşturduktan sonra isterseniz şimdi de nasıl içerisine veri koyabileceğimizi görelim. Windows Server AppFabric önbelleğe konulacak olan nesneler için tek zorunluluk bu nesnelerin serilize edilebilir olarak işaretlenmiş olmasıdır. Bunun için sınıf tanımlamasının hemen üzerinde Serializable özniteliği kullanılmalıdır. Aşağıda tanımlamasını bulacağınız OnbellegeAtilabilirNesne sınıfı önbelleğe alınabilecek sınıfların tanımlarına bir örnek olup yazımın devamında bu sınıf üzerinden örnekleme yaparak konunun pekişmesine çalışacağım.

[Serializable]
public class OnbellegeAtilabilirNesne {
    public string BirStringIfade { get; set; }
    public int BirIntIfade { get; set; }
}

Görüldüğü gibi basit bir tanımlamaya sahip olan OnbellegeAtilabilirNesne sınıfı bir string ve bir int özellikten oluşmaktadır.

Windows Server AppFabric önbelleğe yeni bir nesne koymak için öncelikle ilgili sınıfın bir örneğini almalı ve bu örnek için tekil bir anahtar belirlemelisiniz. Ardından önbellek nesnesi üzerindeki Add metodu yardımıyla nesnenizi önbelleğe ekleyebilirsiniz;

var ornekVeri = new OnbellegeAtilabilirNesne { 
    BirStringIfade = "Test verisi", 
    BirIntIfade = 1 
};

var ornekVeriSurumu = onbellek.Add("testAnahtari", ornekVeri);

Add metodu ile ilgili dikkat etmeniz gereken bir nokta, bu metodu kullanarak bir önbelleğe aynı anahtarla ikinci bir değer eklenemeyecek olmasıdır. Eğer yukarıdaki kodu arka arkaya iki kez çalıştıracak olursanız aşağıdaki hatayı aldığınızı göreceksiniz;

ErrorCode<ERRCA0008>:SubStatus<ES0001>:Önbellekte zaten varolan bir Anahtar ile nesne oluşturulmaya çalışılıyor. Önbellek, nesneler için yalnızca benzersiz Anahtar değerlerini kabul eder.

Ancak; eklediğiniz ilk değer zamanının dolmasıyla birlikte hafızadan silinirse ikinci kez eklediğinizde bu hata mesajını almazsanız.

Önbelleğe değer ekleme sırasında kullanılan Add metoduna alternatif olarak Put metodu da kullanılabilir. Üstelik Add metodundan farklı olarak Put metodunda aynı anahtar ile ikinci bir değer eklenmesi durumunda hata almazsınız. Put metodu aynı değerle ikinci bir anahtar eklenmeye çalışıldığında önceki değerin üzerine yeni değeri yazar.

var ornekVeri = new OnbellegeAtilabilirNesne { 
    BirStringIfade = "Test verisi", 
    BirIntIfade = 1 
};

var ornekVeriSurumu = onbellek.Put("testAnahtari", ornekVeri);

Bu iki metodtan hangisi kullanacağınız iş mantığınıza göre değişecektir.

Önbelleğe eklenmiş verilere Get metodu kullanılarak erişilebilir. Aşağıdaki kod parçacığı daha önceden önbelleğe testAnahtari anahtarı ile eklediğimiz veriye nasıl erişebileceğimizi göstermektedir;

OnbellegeAtilabilirNesne ornekVeri;

if ((ornekVeri = (OnbellegeAtilabilirNesne)onbellek.Get("testAnahtari")) != null) {
    MessageBox.Show(string.Format(@"'testAnahtari' ahtarıyla saklanmış veri önbellekten okundu :
        BirStringIfade : {0} 
        BirIntIfade : {1}", 
        ornekVeri.BirStringIfade, 
        ornekVeri.BirIntIfade));
}
else {
    MessageBox.Show("önbellekte 'testAnahtari' anahtarı ile bir veri bulunamadı");
}

Add, Put ve Get metodları aksi belirtilmediği sürece küme tarafında yonetilen sitem regionlarında işlem yapmaktadır. İstenirse bu metodların işlem yapılmak istenen region’ı belirtebileceğiniz overload’ları da kullanılabilir. Aşağıdaki kod parçacığı ile Add ya da Put ile eklediğiniz verilerin hangi sistem alanında yer aldığını bulabilirsiniz;

var testAnahtariBolgeAdi = onbellek.GetSystemRegionName("testAnahtari");

Önbelleğe eklediğiniz bir veriyi silmek isterseniz de onbellek nesnesi içerisinde yer alan Remove metodunu kullanabilirsiniz;

onbellek.Remove("testAnahtari");

Görüldüğü gibi Windows Server AppFabric Önbellek işlemleri daha önceki makalelerimde sizlerle paylaştığım mimariyi mümkün olduğunda saklayarak geliştiricilere mümkün olan en basit şekilde bir arayüz sağlamıştır. Pek çok işlem bir kaç basit metod çağrısı ile yapılabilir. Buna bir başka örneği aşağıdaki region oluşturarak bu region içerisine veri eklemeyi göstern kod parçacığında bulabilirsiniz;

onbellek.CreateRegion("testBolgesi");
onbellek.Add("testAnahtari1", new OnbellegeAtilabilirNesne {
    BirStringIfade = "Test verisi 1",
    BirIntIfade = 1
}, "testBolgesi");

onbellek.Add("testAnahtari2", new OnbellegeAtilabilirNesne {
    BirStringIfade = "Test verisi 2",
    BirIntIfade = 1
}, "testBolgesi");

onbellek.Add("testAnahtari3", new OnbellegeAtilabilirNesne {
    BirStringIfade = "Test verisi 3",
    BirIntIfade = 1
}, "testBolgesi");

Şimdiye kadar anlattıklarım Windows Server AppFabric önbelleğini kullanan uygulamalar geliştirmenizde hızlı bir başlangıç olacaktır. Temel işlemler olan veri ekleme, değiştirme ve çıkarmanın yanı sıra bir bölge oluşturup aynı işlemleri bu bölge üzerinde gerçekleştirebilirsiniz.

Windows Server AppFabric önbelleği yukarıda anlattığım istemci kütüphanesi sayesinde önbellek kümesi ile haberleşebilmektedir. Bu haberleşme de arka planda WCF altyapısını kullanmaktadır. Yapılan bu işlemler ağ üzerinde gidip geldiği için bir maliyeti vardır. Bir önbelleği ilk kez ayağa kaldırırken programsal olarak yaptıklarımızı ele alalım; önbellekten veri çekerken kullandığımız her Get metod çağrısında bir WCF isteği oluşmakta, bu durumda büyük ölçekli verileri getirirken oluşacak yükü sanırım anlatmama gerek yok. Windows Server AppFabric önbelleği tasarlanırken bu gibi senaryolar da göz önüne alınarak toplu veri çekilmesi için bir metod eklemiştir; BulkGet. Belirli bir bölge için vereceğiniz anahtarlar çekilerek uygun veriler size toplu olarak iletilmektedir. Aşağıda bir önceki örnekte oluşturduğum ve içerisine veri eklediğim testBölgesi içerisindeki verilerin BulkGet ile sorgulanmasına dair örnek bir kod parçacığı bulabilirsiniz;

var ornekVeriler = onbellek.BulkGet(new[] { 
    "testAnahtari1",
    "testAnahtari2", 
    "testAnahtari2" }, "testBolgesi");

Dağıtık bir ortamda önbellek hizmeti sunan Windows Server AppFabric’in sunduğu bir diğer özellikte güvenli güncellemedir. Güncellenmesi istenen nesne, istenirse küme içerisinden alınırken kilitlenmekte, bu sayede de aynı anda tek bir istemci nesneye erişerek güncelleyebilmektedir. Güvenlik güncelleme amacıyla Windows Server AppFabric önbellek bize  Unlock, GetAndLock, PutAndUnlock gibi metodlar sunmaktadır.

Aşağıdaki örnek kod parçacığında, daha önceden testAnahtari anahtari ile önbelleğe eklemiş olduğumuz nesne GetAndLock metodu kullanılarak kilitlenerek değeri alınmış ve PutAndUnlock metodu ile güvenli bir şekilde güncellenerek kilit kaldırılmıştır.

DataCacheLockHandle handle;
var onbellegeAtilabilirNesne = onbellek.GetAndLock("testAnahtari", 
    TimeSpan.FromSeconds(1), 
    out handle) as OnbellegeAtilabilirNesne;

onbellegeAtilabilirNesne.BirStringIfade = "Değiştirilmiş Veri";

onbellek.PutAndUnlock("testAnahtari", onbellegeAtilabilirNesne, handle);

Dikkat edecek olursanız bu örnekte nesne GetAndUnlock ile değeri alınıp önbellekte kilitlenirken parametre olarak TimeSpan kabul etmekte. TimeSpan kullanarak belirttiğimiz bu süre nesnenin önbellek tarafından ne kadar süreyle kilitli tutulacağını belirtir. Bu süre içerisinde nesne kilidi kaldırılmazsa önbellek otomatik olarak kaldıracaktır. Bu yöntem sayesinden olası istemci bağlantı problemleri sonucunda nesnenin sonsuza kadar kilitli kalmasının önüne geçilmiş olur.

Kilitlenmiş bir nesne üzerinde yapılan işlemler sonrasında herhangi bir güncelleme yapılmadan kilidin kaldırılması istenirse PutAndUnlock yerine Unlock metodu kullanılabilir. Unlock metodu veri güncellemesi yapmayıp sadece mevcut kilidi kaldıracaktır.

Not : GetAndLock ile bir anahtara ait değeri almaya ve kilitleme çalıştığınızda kaydı olmayan bir anahtar kullanırsanız aşağıdaki hata mesajını alırsınız;

ErrorCode<ERRCA0006>:SubStatus<ES0001>:Başvurulan Anahtar yok. Hatayı gidermek için bir Anahtarı temel alan nesneler oluşturun.

Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

Türkçe, C#, AppFabric Cache ,