Async CTP’nin WCF İstemcilerinde Kullanımı

  PDC 2010’da duyurulan ve "C# 5, Async ile Kolaylaşan Asenkron İşlemleri" başlıklı makalemde detaylarını sizinle paylaştığım C#’in yeni sürümü ile birlikte gelecek olan senkron programlamaya yönelik yeni anahtar kelimeleri yazılım geliştiricileri arasında gerçekten de büyük ilgi uyandırdı. C#’ın yeni sürümünü beklemeden Visual Studio Async CTP‘yi kurarak da deneyebileceğiniz yeni anahtar kelimeleri kullanmaya başladığınızda makalemde anlattıklarım sizlerin de hoşuna gidecektir. Bir iki deneme ardından benzer işleri gerçek hayattaki kullanımlarınız için denemeye geçersiniz. İşte tam da bu noktada, WCF ile bir web hizmetine bağlanmaya çalıştığınızda, önemli bir eksiklik fark edeceksiniz; otomatik üretilen web hizmet referanslarında async ctp ile kullanılabilecek bir fonksiyon bulunmamakta. Bu makalemde sizlere Visual Studio Async CTP’yi kullanarak WCF hizmet istemcilerinizde nasıl asenkron fonksiyonları kullanabileceğinizi paylaşıyor olacağım.

    Visual Studio Async CTP’de WCF hizmetleri için Visual Studio referans ekleme işlemi sırasında asenkron fonksiyonların oluşmamasının bir kaç nedeni bulunmakta; bunlardan ilki bu özelliğin CTP’ye yetişmemiş olması; ama merak etmeyin ilerleyen Visual Studio sürümlerinde bu özellik bulunacak. İkincisi ise, bu CTP’nin WCF ekibince değil, C# ve Visual Basic.Net ekiplerince çıkartılmış olması.

   Visual Studio tarafından oluşturulan referans kodu içerisinde  Visual Studio Async CTP’ye yönelik bir kod üretilmiyor olması yazılım geliştirici olarak sizlerin bu özellikler WCF için kullanamıyor olacağınız anlamına kesinlikle gelmeyecektir. CTP’yi WCF istemcilerimizde kullanabilmenin iki yolu bulunmakta. Bu yöntemlerden ilkinde mevcut projelerinizde bu özelliği kullanmak istediğinizde asenkron tasarım kalıbını takip eden bir kaç satırlık bir kod yazmanız yeterli olacaktır. Örnek olarak "Bir WCF Hizmetine İstemci Oluşturma" makalemde paylaşmış olduğum WCF hizmet istemcimizi ele alalım. Burada ele aldığımız WCF hizmetinin integer türünden veri dönen basit bir say fonksiyonu bulunmaktaydı. Öncelikle, örneğimizde hizmetimizi istemci projemizde referans olarak eklerken "generate asyncronous operations" seçeneğinin seçili olduğuna emin olalım. Önceden eklenmiş hizmet referanslarında ise referans üzerinde sağ tıklayarak gelen menüden "Configure Service Reference…" seçeneğiyle gelen ekranda aynı işlem tekrarlanabilir.

Service Reference Settings ekranında "Generate asynchronoud operations" seçili olmalı

   Yukarıdaki parametrelerle oluşan WCF hizmet vekil (proxy) kodumuz içerisinde asenkron fonksiyonlarda barındıracağından bu noktadan sonra async ve await anahtar kelimelerini de kullanarak kolaylıkla kodumuzu asenkron çalıştırabiliriz. Aşağıda bu amaçla kullanılabilecek olan örnek bir genişletme (extension) fonksiyon bulabilirsiniz;

public static class OrnekHizmetClientExtensions {
    public static Task<object> SayTaskAsync(this OrnekHizmetClient ornekHizmetClient) {
        var taskCompletionSource = new TaskCompletionSource<object>();

        ornekHizmetClient.BeginSay(geribildirim => {
            try {
                taskCompletionSource.SetResult(ornekHizmetClient.EndSay(geribildirim));
            }
            catch (Exception hata) {
                taskCompletionSource.SetException(hata);
            }
        }, null);

        return taskCompletionSource.Task;
    }
}

   Kodumuzu Visual Studio tarafından otomatik üretilen kod içerisine yazmak yerine genişletme fonksiyonu içerisinde ayrı bir yerde sunarak referansın güncellenmesi durumunda kodumuzu kaybetme olasılığından kurtulmuş oluruz.

   Bir diğer yöntem ise bu işlemin Visual Studio referans kodu üretilirken araya girilerek yapılmasıdır. Bunun için gerekli kod CTP ile birlikte gelen örneklerden (C# WCF) Stock Quotes örneği içerisinde yer almaktadır. Bu örnekte yer alan TaskWsdlImportExtension projesini ya da bu projenin derlenmesi sonrası oluşan TaskWsdlImportExtension.dll’ini kendi projenize referans olarak ekledikten sonra projenizin app.config dosyasını aşağıdaki değerleri de alacak şekilde güncellemeniz gerekmekte;

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
 <system.serviceModel>
 <client>
  <metadata>
  <wsdlImporters>
   <extension type="TaskWsdlImportExtension.TaskAsyncWsdlImportExtension, TaskWsdlImportExtension" />
  </wsdlImporters>
  </metadata>
 </client>
 </system.serviceModel>
</configuration>

    Bu adım sonrasında önceki yöntemde olduğu gibi asenkron fonksiyonların da oluşması için "generate asyncronous operations" seçeneğini seçtiğinizde artık Visual Studio sizin yerinize gerekli kodları üretecektir. Visual Studio’nun ve .Net framework’ün bir sonraki sürümünde artık bu adımları takip etmenize gerek kalmaksızın gerekli kodlar üretebiliyor olacaktır.

    Windows Communication Foundation içerisinde asenkron tasarım kalıbının kullanılması bir süredir süregelen bir  tartışma aslına bakarsanız; fakat şimdiye kadar ki .Net framework sürümlerinden bu kalıbın adaptasyonu sırasında çeşitli sıkıntılar ortaya çıkmakta, yazılım geliştiricinin dikkat etmesi gereken pek çok nokta olmaktaydı. Visual Studio Async CTP’nin çıkışıyla birlikte WCF ekibi de kolları sıvayarak hızla bu konuda gerekli hazırlıklarını yapmaktalar. Bir sonraki sürümde asenkron hizmet tanımlamaları için Begin… End… gibi süreç başlatan/bitiren fonksiyonları eklemek ya da OperationContract.AsyncPattern değişkenine true değer atanmasına gerek kalmadan aşağıdaki şekilde WCF kontratı tanımlamanız da mümkün olacak;

[

[ServiceContract]
public interface IHizmetArayuzu
{
    [OperationContract]
    Task<int> SayTaskAsync();
}

   WCF’in asenkron programlama konusunda gittiği yön hakkında WCF program yöneticisi Amadeo Casas’ın yakın zaman önce paylaştığı makalede bu konuda hizmet ve istemci kodlarında yapılacak değişikleri de bulabilirsiniz.

Fatih Boy

Ankara'da yaşayan Fatih, bir kamu kurumunda danışman olarak çalışmaktadır. ALM süreçleri, kurumsal veri yolu sistemleri, kurumsal altyapı ve yazılım geliştirme konularında destek vermektedir. Boş zamanlarında açık kaynak kodlu projeler geliştirmeyi ve bilgisini yazdığı makalelerle paylaşmayı seven Fatih, aynı zamanda Visual C# ve Visual Studio teknolojileri konusundan Microsoft tarafından altı yıl üst üste MVP (En Değerli Profesyonel) ödülüne layık görülmüştür. İş hayatı boyunca masaüstü uygulamaları, web teknolojileri, akıllı istemciler gibi konularda Asp.Net, Php, C#, Java programlama dilleri ve MySql, MsSql ve Oracle gibi veritabanı yönetim yazılımları ile çalışmıştır. İngilizce ve Türkçe olarak yayınlanan makalelerini gerek İngilizce bloğunda, gerekse de Türkçe bloğunda bulabileceğiniz gibi web sitesinden de açık kaynak kodlu geliştirdiği yazılımlarına ulaşabilirsiniz. vCard - Twitter - Facebook - Google+

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir