Önceki makalemde sizlerle C# üzerinden AppFabric Cache PowerShell komutlarını nasıl kullanabilceğinizi paylaşmıştım. Örnek kod üzerinden nasıl önbellek kümesine bağlanabileceğinizi ve yeni bir önbellek oluşturabileceğinizi anlatmıştım;

var initialSessionState = InitialSessionState.CreateDefault();
initialSessionState.ImportPSModule(new[] { "DistributedCacheAdministration" });
initialSessionState.ThrowOnRunspaceOpenError = true;

var cacheRunspace = RunspaceFactory.CreateRunspace(initialSessionState);

cacheRunspace.Open();

var pipe = cacheRunspace.CreatePipeline();

pipe.Commands.Add("Use-CacheCluster");

var newCacheKomutu = new Command("New-Cache");
newCacheKomutu.Parameters.Add("CacheName", "test");
pipe.Commands.Add(newCacheKomutu);

var sonuc = pipe.Invoke();

PowerShell komutlarımızın çalışacağı bir çalışma alanı içerisinde bir pipeline oluşturmuş ve son satırda bu pipeline’ı çalıştırmıştık. Bu örnekte dikkat edecek olursanız sonuc değişkeni içerisinde System.Management.Automation.PSObject barındıran 0 boyutlu bir koleksiyon bulunmamakta; çünkü pipeline içerisinde çalıştırdığımız AppFabric Cache komutlarının bir geri dönüş değeri bulunmamakta.

Bu makalemde AppFabric Cache komutlarından gelen bilgileri C# içerisinde nasıl kullanabileceğinizi anlatmaya çalışacağım.

Önceki makaledeki kodu ilk çalıştırmanız sonrasında alınan aşağıdaki ekran görüntüsünde PowerShell oturumunda, DistributedCacheAdministration modülünün yüklendiğini ve bilgisayarın bağlı olduğu önbellek kümesinin kullanıldığını, ardından da bu önbellek kümesinde bulunan önbelleklerin listesinin alındığını göreceksiniz.

Get-Cache

Görüldüğü gibi test adıyla bir önbellek oluşturulmuş durumda.

Aynı kodu ikinci defa çalıştıracak olursanız, verdiğiniz isimde bir önbelleğin küme içerisinde daha önceden oluşturulmuş olduğuna dair “ErrorCode<ERRCAdmin011>:SubStatus<ES0001>:Specified Cache is already present in cluster.” şeklinde bir hata mesajı alırsınız. Bu durumdan kaçınmak için öncelikle küme içerisindeki önbellekleri listeyip içlerinde oluşturmak istediğimiz önbelleğin olup olmadığına bakmalıyız. Eğer yoksa yeni bir önbellek oluşturmalıyız.

pipe.Commands.Add("Get-Cache");

var sonuc = pipe.Invoke();

ilk kodumuzdaki diğer komutları çıkartaran sadece “Get-Cache” kullandığımız yukarıdaki örnek kod bize içerisinde sadece tek bir elemanı olan bir PSObject listesi verecektir. Quick Watch ile sonuc değişkenine bakacak olursak 0. indeksteki PSObject içerisinde CacheInfo türünden bir nesne barındırdığını görürüz. Bu nesneye PSObject içerisindeki BaseObject özelliğinden ulaşabiliriz.

Sonuc QuickWatch

Aşağıdaki kodla, gelen sonuçlar arasında test önbelleği olup olmadığını kontrol ederek bu bilgiyi daha sonra kullanmak üzere bir boolean içerisinde tutuyoruz.

var testOnbellegiBulundu = false;
foreach (var cacheInfoPSObject in sonuc)
{
var cacheInfo = ((CacheInfo)cacheInfoPSObject.BaseObject);

if (cacheInfo.CacheName == "test")
{
testOnbellegiBulundu = true;
break;
}
}

devamında ise eğer test önbelleği yoksa ilk örneğimizdeki oluşturma kodunu çalıştırıyoruz;

if (!testOnbellegiBulundu)
{
pipe = cacheRunspace.CreatePipeline();

var newCacheKomutu = new Command("New-Cache");
newCacheKomutu.Parameters.Add("CacheName", "test");
pipe.Commands.Add(newCacheKomutu);

pipe.Invoke();
}

AppFabric Cache PowerShell komutları ve bu komutları çalıştırdığımızda dönecek nesneleri get-help komutu yardımıyla öğrenebiliriz. Örneğin; Get-Cache komutu hakkında aşağıdaki şekilde bilgi alabilirsiniz;

Get-Help Get-Cache -full

Get-Help Get-Cache -full

Gelen yardım bilgilerinin sonunda komutun çıktısı hakkındaki bilgiler “OUTPUTS” başlığı altında verilmektedir.

Şimdiye kadar ki anlattıklarımı toparlayacak olursak, kodumuz aşağıdaki hale gelmiştir;

var initialSessionState = InitialSessionState.CreateDefault();
initialSessionState.ImportPSModule(new[] { "DistributedCacheAdministration" });
initialSessionState.ThrowOnRunspaceOpenError = true;

var cacheRunspace = RunspaceFactory.CreateRunspace(initialSessionState);

cacheRunspace.Open();

var pipe = cacheRunspace.CreatePipeline();

pipe.Commands.Add("Use-CacheCluster");

pipe.Commands.Add("Get-Cache");

var sonuc = pipe.Invoke();

var testOnbellegiBulundu = false;
foreach (var cacheInfoPSObject in sonuc)
{
    var cacheInfo = ((CacheInfo)cacheInfoPSObject.BaseObject);

    if (cacheInfo.CacheName == "test")
    {
        testOnbellegiBulundu = true;
        break;
    }
}


if (!testOnbellegiBulundu)
{
    pipe = cacheRunspace.CreatePipeline();

    var newCacheKomutu = new Command("New-Cache");
    newCacheKomutu.Parameters.Add("CacheName", "test");
    pipe.Commands.Add(newCacheKomutu);

    pipe.Invoke();
}

Şimdiye kadar anlatılanlarla oluşturmak istediğimiz önbelleğin varlığı kontrol ettikten sonra yoksa oluşturmayı, çalıştırılan PowerShell komutlarının sonuçlarını cast ederek kullanmayı öğrendik; fakat bazı AppFabric Cache komutlarında malesef ki hayat biz yazılım geliştiriciler için o kadar kolay olmuyor.Bazı komutların sonuç sınıfları barındıkları assembly içerisinde internal olarak tanımlanmaları nedeniyle dışarıdan kullanılamayabilir. Get-CacheStatistics komutunu ele alalım;

Get-Help Get-CacheStatistics -full

Get-Help Get-CacheStatistics -full

Bu komut bize iki tür sonuç döndürebilir;

  1. Microsoft.Data.Caching.NamedCacheStats (gerçekte Microsoft.ApplicationServer.Caching.NamedCacheStats)
  2. Microsoft.Data.Caching.HostCacheStats (gerçekte Microsoft.ApplicationServer.Caching.HostCacheStats)

 

Fakat bunlar assembly dışından erişilemeyen sınıflar (internal class) olduğu için kodumuz içerisinde doğrudan kullanamayız. Peki bu durumda ne yapmalıyız?

Bu durumda PSObject.BaseObject NamedCacheStats ya da HostCacheStats sınıflarına dönüştürülemeyeceği için imdadımıza PSObject’in Properties özelliği yetişiyor. Properties yardımıyla PSObject’in barındırdığı sonuç nesnesinin özelliklerine erişilebilir.

var psObject = sonuc[0];

var ItemCount = (long)psObject.Properties["ItemCount"].Value;
var MissCount = (long)psObject.Properties["MissCount"].Value;
var RegionCount = (long)psObject.Properties["RegionCount"].Value;
var RequestCount = (long)psObject.Properties["RequestCount"].Value;
var Size = (long)psObject.Properties["Size"].Value;

Şu Yazıları da Sevebilirsiniz

Leave a Comment

* Bu formu kullanarak, verilerinizin bu web sitesi tarafından saklanması ve kullanılmasını kabul ediyorsunuz.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Bu web sitesi deneyiminizi geliştirmek için çerezleri kullanır. Bunu kabul ettiğinizi varsayacağız, ancak isterseniz vazgeçebilirsiniz. Kabul Et Daha Fazla Bilgi