Programsal Olarak WCF Hizmeti Oluşturma

  Bir önceki makalemle birlikte Windows Communication Foundation’ın (WCF) detaylarını sizlerle paylaşacağım seriye başlamış ve giriş düzeyindeki bilgiler ile basit bir hizmet oluşturarak uygulamamız üzerinden bu hizmeti istemcilerimize sunmuştuk. Üstelik hizmetimiz oluştururken de minimum düzeyde kod yazmış ve yapılandırma işlerimizi tamamen app.config dosyası üzerinden gerçekleştirmiştik. Pek çok WCF senaryosunda bu şekilde statik olarak yapılandırılmış hizmetler biz yazılım geliştiricilerin işini görse de, benim gibi tüm sürece hakim olmak isteyen bir insansanız ya da dinamik olarak WCF hizmetleri sunmanızı gerektiren iş mantıklarınız bulunuyorsa şüphesiz ki elinizi biraz koda bulaştırmanız gerekecektir.

   Bu makalemde, WCF’e giriş makalemde sizlerle paylaşmış olduğum örnek WCF hizmeti üzerinden giderek, aynı hizmeti app.config ile yapılandırma yöntemini kullanmadan nasıl kod içerisinde oluşturabileceğinizi sizlerle paylaşıyor olacağım.

    Bir WCF hizmetini kodumuz içerisinde oluşturuyorsak, ilk yapmamız gereken şey hizmetimizde kullanılacak temel adres(ler)i belirlemek olmalıdır;

Uri hizmetTemelAdresi = new Uri("http://localhost:1234/WCFOrnekleri");

   Hemen ardından da bu adresi temel alarak bir WCF hizmeti oluşturmalıyız;

ServiceHost hizmetSunucusu = new ServiceHost(typeof(OrnekHizmet), hizmetTemelAdresi); 

   Örnekten de göreceğiniz gibi WCF hizmetimizi oluştururken hizmet türünü de temel adres ile birlikte veriyoruz. Aynı app.config yapılandırmasında yaptığımız gibi burada da birden fazla temel adres verebilmemiz mümkün. Dikkat edilmesi gereken nokta; ServiceHost sınıfının birden fazla temel adres kabul etmesindeki neden, farklı bağlayıcılar (bindings) için kullanılacak temel adreslerin farklı olmasıdır. Dolayısıyla aynı protokol için sadece bir temel adres verilmelidir. Hizmet sunucusu oluşturmakta kullandığımız ServiceHost sınıfının constructer’ı kullanılarak iş mantığınız doğrultusunda ileri düzeyde değişik hizmetler oluşturmanız da mümkündür. Bu makalenin konusu olmadığı için şimdilik değinmeyeceğim bu yöntemleri ilerleyen makalelerimde sizlerle paylaşıyor olacağım.

   Giriş makalemde paylaştığım WCF’in ABC’si hizmetimizi kod ile oluştururken de geçerli olacaktır. Temel adresler ve hizmet türü ile bir hizmet sunucusu oluşturduktan sonra, artık hizmetimizi sunacağımız uç noktalarımızı (endpoint) hazırlayabiliriz;

hizmetSunucusu.AddServiceEndpoint(typeof(IOrnekHizmet), new WSHttpBinding(), "OrnekHizmet");

   Gördüğünüz gibi bir hizmet sunucu için yeni bir uç nokta tanımlamak oldukça kolay. Kontratımızı, bağlayıcımızı ve adresimizi (yani ABC’mizi) verdiğimizde artık hizmetimizi sunabileceğimiz bir uç nokta tanımlamış oluyoruz.

   Tam bu noktada bir kaç önemli not düşmek istiyorum;

  • Hizmet sunucumuz aynı kontratı farklı bağlayıcı ve adreslerle sunabilir. Bunun için AddServiceEndpoint fonksiyonunu her bir adres ve bağlayıcı kombinasyonu için aynı kontrat arayüzünü kullanmak şartıyla çağırmamız yeterli olacaktır.
  • Uç noktamızı eklerken kullanacağımız adres, örnekte olduğu gibi, göreceli (relative) adres olabileceği gibi, tam adreste (absolute) olabilir. Adres olarak göreceli adres verilmesi durumunda kullanılan bağlayıcıya göre ilgili temel adres seçilerek verilen adres ile birleştirilir ve tam adres oluşturulur. Adres olarak tam adres verilmesi durumunda ise herhangi bir ek işlem yapılmaksızın verilen adres uç nokta tanımlamada kullanılacaktır.

       Aksi gerekmediği sürece göreceli adres kullanımını tercih etmenizi tavsiye ederim. Bu sayede tek bir değişiklikle (temel adresi değiştirerek) tüm hizmet uç noktalarınızı adresi güncellenmiş olacaktır.
  • Aynı hizmeti farklı kontratlarla da sunabilmeniz mümkün. Bunun için yapmanız gereken hizmet sınıfınızın farklı kontratları (arayüzleri) kullanmasını sağlamaktır. Ardından AddServiceEndpoint fonksiyonunu kullanarak istediğiniz kontratlar için uç nokta ekleyebilirsiniz.

   Şimdiye kadar tamamladığımız adımlarla hizmet sunucumuz başlatılmaya hazır; fakat henüz istemcilerce bir vekil (proxy) sınıf oluşturulabilmesi için gereken meta veri yayınlanmamakta. Zorunlu olmamasına karşın hizmetinizi kullanmak isteyecek 3. parti yazılım geliştirilerce kullanılacak olan meta veri aşağıdaki adımlar ardından yayınlanıyor olacak;

ServiceMetadataBehavior hizmetMetaVeriDavranisi = new ServiceMetadataBehavior { HttpGetEnabled = true };
hizmetSunucusu.Description.Behaviors.Add(hizmetMetaVeriDavranisi);

  Bu noktadan sonra hizmet sunucumuzu açarak istekleri kabul etmeye başlayabiliriz;

hizmetSunucusu.Open();

   Aşağıda makalemde sizler paylaştığım örnek uygulamamızın kodlarını toplu halde bulabilirsiniz; (ek olarak hata yönetimi ile ilgili girdiler bulacaksınız…)

Console.WriteLine("Hizmet sunucusu hazırlanıyor...");
Uri hizmetTemelAdresi = new Uri("http://localhost:1234/WCFOrnekleri");

ServiceHost hizmetSunucusu = new ServiceHost(typeof(OrnekHizmet), hizmetTemelAdresi); 

try {
    hizmetSunucusu.AddServiceEndpoint(typeof(IOrnekHizmet), new WSHttpBinding(), "OrnekHizmet");


    ServiceMetadataBehavior hizmetMetaVeriDavranisi = new ServiceMetadataBehavior { HttpGetEnabled = true };
    hizmetSunucusu.Description.Behaviors.Add(hizmetMetaVeriDavranisi);

Console.WriteLine("Hizmet sunucusu başlatılıyor...");
hizmetSunucusu.Open();

Console.WriteLine("Hizmet sunucusu hazır");
Console.WriteLine("Hizmet sunucusunu sonlandırmak için herhangi bir tuşa basınız");
Console.ReadKey();

hizmetSunucusu.Close();
}
catch (Exception ex) {
Console.WriteLine("Hizmet sunucusunda hata oluştu: {0}", ex.Message);

if (hizmetSunucusu.State != CommunicationState.Closed || hizmetSunucusu.State != CommunicationState.Closing) {
hizmetSunucusu.Abort();
}

Console.WriteLine("Uygulamayı sonlandırmak için herhangi bir tuşa basınız");
Console.ReadKey();
}

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