Programsal Olarak WCF Hizmeti Oluşturma

Print Friendly

  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();
}

Related posts:

  1. C# Programsal Olarak AppFabric Cache Host Bilgisine Erişmek
  2. Programsal Olarak Bir ASP.Net Sayfasına Veri Göndermek
  3. WCF’e Giriş
  4. Outlook’ta bir dizinde mail nesnesi oluşturma
  5. Çalışma-Zamanı Dinamik Kod Oluşturma
  6. Managed WMI Sınıfları Oluşturma
  7. Otomatik Olarak ASP.Net Uygulaması Hata Dökümünü Alma
  8. Tip : PowerShell Oturumu Sistem Yöneticisi Olarak Mı Başlatılmış?
  9. Outlook mail nesnesi içerisine özel alanlar ekleme ve yeni görünüm oluşturma
Twitter Digg Delicious Stumbleupon Technorati Facebook Email

About Fatih Boy

İzmir'li bir bilgisayar mühendisi olan Fatih, özel bir firmada Proje Müdürü olarak çalışmaktadır. Boş zamanlarında açık kaynak kodlu projeler geliştirmeyi ve bilgisini yazdığı makalelerle paylaşmayı seven Fatih, aynı zamanda Visual C# konusundan Microsoft tarafından iki 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+

No comments yet... Be the first to leave a reply!

Leave a Reply

 
QR Code Business Card