'WCF' Kategorisindeki Makaleler


IIS Olmadan WCF Host Etme

WCF servislerini IIS olmadan host etmenin bir yoluna ihtiyacınız hiç oldu mu? Eğer olduysa bunu başarmanın kolay bir yolu var: ServiceHost sınıfı. ServiceHost herhangi bir uygulama içerisinde (konsol, winforms vs.) bir servisi başlatıp bitirmemizi ve yaşam süreci boyunca kullanmamızı sağlar. Bu sınıfı test etmek amacıyla biri servisi host edecek öteki de kullanacak olan iki konsol uygulaması kullanacağız.

Not: Her iki uygulamada da WCF sınıflarını kullanabilmek için System.ServiceModel kütüphanesini referans eklemek gerektiğini unutmayınız.

Wcf_Host isimli uygulama adından da anlaşılacağı gibi servisimizi host eden uygulamadır. Uygulamada servisin imzasını belirten IMatServis ServiceContract’ı ve servisi tanımlayan MatematikServis sınıfları vardır. Servisin endpoint bilgileri ise App.config dosyası içerisine yazılmıştır.

IMatServis.cs :

using System;
using System.ServiceModel;

namespace Wcf_Host
{
    [ServiceContract]
    interface IMatServis
    {
        [OperationContract]
        double Topla(params double[] sayilar);
    }
}

MatematikServis.cs :

using System;
using System.Linq;

namespace Wcf_Host
{
    class MatematikServis : IMatServis
    {
        public double Topla(params double[] sayilar)
        {
            return sayilar.Sum();
        }
    }
}

App.config :

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="Wcf_Host.MatematikServis">
        <endpoint address="http://localhost:1020/MatematikServis" 
                  binding="basicHttpBinding" contract="Wcf_Host.IMatServis" />
      </service>
    </services>
  </system.serviceModel>
</configuration>

Şimdi sırada servisin host edilmesi var. Host işlemi için kullanacağımız ServiceHost sınıfı bizden çalıştıracağı servisin türünü parametre olarak bekler. Bu parametreyi verdikten sonra istenirse servisin kullanacağı binding tipi ve endpointler programatik olarak tanımlanabilir. Ancak biz zaten projemizde bu bilgileri App.config dosyası içerisinde verdiğimizden tekrar belirtmemize gerek bulunmamaktadır.

Artık servisi yayına başlatmak için tek yapmamız gereken ServiceHost nesnesinin Open() metodunu kullanarak servisi yayına açmaktır. Open metodu çağırıldıktan sonra uygulama Main metodu içerisinde kendisini çalıştırmaya devam eder ve Close metoduna gelerek kendini hemen kapatır. Servisin bir tuşa basılana kadar açık kalmasını sağlamak için de basitçe bir Console.ReadLine metodu koyarak host uygulamasının beklemesini sağladık.

Program.cs :

using System;
using System.ServiceModel;

namespace Wcf_Host
{
    class Program
    {
        static void Main(string[] args)
        {
            //MatematikServis türünden bir servisi host edeceğini bildirme
            ServiceHost host = new ServiceHost(typeof(MatematikServis));

            host.Open(); //servis yayınını başlatma
            Console.WriteLine("Servis Yayına Açıldı...");

            Console.ReadLine(); //yayının açık kalmasını sağlama
            host.Close(); //yayını kapatma
            Console.WriteLine("Servis Yayını Kapatıldı...");
        }
    }
}

Şimdi servisimizi test etmek için bir client uygulaması hazırlayalım. Bu uygulamada yine Contractımız bulunacak, servis proxyi ise bir MatematikServisClient isminde bir sınıf belirtecektir. Bu sınıfın tanımlaması aşağıdaki gibidir.

MatematikServisClient.cs :

using System;
using System.ServiceModel;

namespace MatematikIslemler
{
    class MatematikServisClient : ClientBase, IMatServis
    {
        public double Topla(params double[] sayilar)
        {
            return Channel.Topla(sayilar);
        }
    }
}

Client uygulamamızdaki bu proxy’nin hangi adrese hangi binding türüyle bağlanacağını ise yine bu uygulamadaki App.Config içerisine aşağıdaki gibi yazıyoruz.

App.config :

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <client>
      <endpoint address="http://localhost:1020/MatematikServis"
                  binding="basicHttpBinding" contract="MatematikIslemler.IMatServis" />
    </client>
  </system.serviceModel>
</configuration>

Son olarak da bu proxyi kullanarak servis çağrımızı yapıyoruz. Unutmayın ki client uygulamasının çalışması için mutlaka host uygulama da açık olmalıdır. Windows Vista ve 7 altında UAC açık olduğunda host uygulamasının düzgün çalışabilmesi için Run as Administrator diyerek uygulumayı yönetici olarak çalıştırmanız gerekmektedir.

Program.cs :

using System;

namespace MatematikIslemler
{
    class Program
    {
        static void Main(string[] args)
        {
            MatematikServisClient cl = new MatematikServisClient();
            double sonuc = cl.Topla(10, 20, -100, 45);
            Console.WriteLine(sonuc);
        }
    }
}

Host uygulaması açıldıktan sonra client çalıştırıldığında elde edeceğimiz ekran çıktıları aşağıdaki gibi olacaktır.

Wcf Host Uygulaması

Wcf Client Uygulaması

Yüce ÇELİKEL
MCPD Enterprise Developer 

Anahtar Kelimeler WCF ServiceHost Binding Contract Endpoint Proxy
Dosyalar