Bu makalem WCF servislerinin nasıl hosting edileceği ile alakalıdır.Bu makalemde WCF ‘ i farklı şekillerde farklı yerlerde nasıl host edilir, gereksinimler nelerdir bunlardan bahsetmeye çalışacağım.

Servisi barındıracak yerler sizin gereksinimlerinize göre değişir.Atıyorum ister Windows Hosting, ister bir IIS Hosting isterseniz bir önceki makalemde anlattığım gibi Sharepoint WepPart içinden ISAPI klasörü içinde, ister Windows Azure içinde(ilerleyen makalelerimde bundan da uzunca bahsedecem.), isterseniz de bir Console uygulamasında host edebilirsiniz.

Küçük bir örnekle bunları ele alalım.

1-Console Uygulamasında Host

İlk olarak WCF Service Library Projesi açıp, arayüzde sadece bir tane metodu bulunan bir servis yazalım.

    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        double Hipotenus(int a, int b);
    }

    //Service.cs dosyasının içeriği
    public class Service1 : IService1
    {
        public double Hipotenus(int a, int b)
        {
            return Math.Sqrt(a * a + b * b);
        }
    }

Şimdi de bu servisin host edileceği Console uygulamasını yazalım.

Not: Burada unutulmaması gereken nokta şudur.Biz uygulamamızı Console üzerinde host edeceğimiz için ServiceHost nesnesini kullanmamız gerekir.Bu yüzden projemize System.ServiceModel kütüphanesini referans olarak göstermemiz gerekir.Daha sonra yazmış olduğumuz servisi referans olarak ekleyelim.Daha Sonra Servisimize bir tane app.config dosyası ekleyip bunun içerisinde servisin gerekli olan address,contract ve binding değerlerini girelim.

<system.serviceModel>
		<services>
			<service name="WcfServiceLibraryForConsole.Service1" behaviorConfiguration="HipoBehavior">
				<endpoint address="Hipotenus" binding="basicHttpBinding" contract="WcfServiceLibraryForConsole.IService1">
					<identity>
						<dns value="localhost"/>
					</identity>
				</endpoint>
				<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
				<host>
					<baseAddresses>
						<add baseAddress="http://localhost:90/"/>
					</baseAddresses>
				</host>
			</service>
		</services>
		<behaviors>
			<serviceBehaviors>
				<behavior name="HipoBehavior">
					<serviceMetadata httpGetEnabled="True"/>
					<serviceDebug includeExceptionDetailInFaults="False" />
				</behavior>
			</serviceBehaviors>
		</behaviors>
	</system.serviceModel>

Program.cs dosyası içeriği

static void Main(string[] args)
        {
            Type tip = typeof(WcfServiceLibraryForConsole.Service1);
            using (ServiceHost host = new ServiceHost(tip))
            {
                host.Open();
                host.Opened += host_Opened;
                host.Closing += host_Closing;
                host.Closed += host_Closed;
                Console.WriteLine(host.State.ToString());
                Service1 client = new Service1();
                Console.WriteLine("7, 24 in hipotenüs değeri {0} ' tir.",client.Hipotenus(7, 24));
                host.Close();
            }
            Console.ReadLine();
        }

        static void host_Closed(object sender, EventArgs e)
        {
            Console.WriteLine("Servis kapandı!");
        }

        static void host_Closing(object sender, EventArgs e)
        {
            Console.WriteLine("Servis Kapanıyor...");
        }

        static void host_Opened(object sender, EventArgs e)
        {
            Console.WriteLine("Servis kullanıma hazır!");
        }

Console uygulamamızı çalıştırdğımızda aşağıdaki gibi bir görüntü oluşacaktır.

console host

2-Windows Service Hosting

Burada Windows Servis, WCF ile birbirine karıştırılmamalıdır.Windows ServisControlManager dan gelir.İşletim sistemi üzerinde yüklenmiş servislerdir.Windows Servis işletim sisteminin özelliklerini  kullanabilir.Network, USB gibi…

Servis arayüzünün  bulunduğu projemizi aynı şekilde Windows Service projemize referans gösterelim.Sonra onStart metodunun içini  aşağıdaki gibi düzenleyelim.

protected override void OnStart(string[] args)
        {
            // TODO: Add code here to start your service.
            try
            {
                string url = "http://localhost:94/Hipo";
                host = new ServiceHost(typeof(WcfServiceLibrary.Service1));
                host.AddServiceEndpoint(typeof(WcfServiceLibrary.IService1), new BasicHttpBinding(), "http://localhost:94/Hipo");
                ServiceMetadataBehavior b = new ServiceMetadataBehavior();
                b.HttpGetEnabled = true;
                b.HttpGetUrl = new Uri(url);
                host.Description.Behaviors.Add(b);
                host.Open();
            }
            catch (Exception ex)
            {

                WriteToEventLog(ex.StackTrace);

            }

        }

Burada endpoint ayarlarını koddan ayarladım ama isterseniz proje dosyasına siz config dosyası ekleyerek xml ile de gerekli ayarlamaları yapabilirsiniz.Ayrıca ben catch e düşerse hatayı Windows Event Log’lara yazdırdım. Daha sonra dan hataları görebilmek için böyle bir metod yapma ihtiyacı duydum.Metodun içeriği

   private void WriteToEventLog(string message)
        {
            string cs = "WindowsServiceHost";
            EventLog elog = new EventLog();
            if (!EventLog.SourceExists(cs))
                EventLog.CreateEventSource(cs, "Application");

            EventLog.WriteEntry(cs, message, EventLogEntryType.Error);
            elog.Source = cs;
            elog.EnableRaisingEvents = true;
            elog.WriteEntry(message);
        }

Şimdi Windows Service’e tıklayıp gelen design ekranında tekrar sağ tıklayıp Add Installer’ a tıklayalım.Daha Sonra ServiceProcessInstaller ve ServiceInstaller tiplerinde 2 nesne eklenecektir.Şimdi Sırasıyla “serviceInstaller1” fielda sağ tıklayıp Properties diyelim.Burada Display Name özelliğine servis adı yazalım.Örnek olarak ben “Windows Service Host Sample” adını verdim.Sonra StartType özelliğini ise “Automatic” olarak değiştirelim.ServiceProcessInstaller nesnesinden örneklenen “serviceProcessInstaller1” fielda Account özelliğine “LocalSystem”  olarak değiştirelim.

Untitled

Sıra geldi windows servisizi yüklemeye.Burada 2 yol izleyebiliriz.İster Setup projesi açıp, servisimizi install edilebilir hale getirip yapabiliriz istersek te (ki ben böyle yaptım.) installutil.exe yi kullanarak deploy edebiliriz.

Deploy için aşağıdaki beyaz ile belirtilmiş kod satırını yazmanız yeterlidir.

commanprompt

Atıyorum bir hata yaptınız.Servisi kaldırmak istiyorsunuz.Bunun içinde “-i” yerine “/u” yazmanız yeterlidir.Ama bunun için Services penceresi açıksa ve Servisiniz çalışır vaziyetteyse önce servisi durdurup, sonra pencereyi kapatıp çalıştırınız.

Şimdi Services penceresiniz açıp servisimizi çalıştırabiliriz.      services

Sonrasında ise web sayfasından endpoint adresiniz çağırırsak servisimizin çalıştığını göreceğiz.

sayfa

 3-IIS(Internet Information Service) Hosting

Bir diğer hosting tipimiz olan IIS Hosting’dir.

IIS üzerinde servisimizi host edebilmemiz için “.svc” uzantılı bir dosyamızın bulunmasıdır.Bunun nedeni ise; WCF servisimizin host edilebilmesi için IIS bizim için  ServiceHost nesnesini yaratıp dış dünyaya sunar.ServiceHost nesnesi WCF’in host altyapısını sunar.

Şimdi bir örnek yapalım.Önce bir tane WCF Service Library oluşturalım.

İçerikleri sırayla aşağıdaki gibi olsun.

IMathLib.cs

    [ServiceContract]
    public interface IMathLib
    {
        [OperationContract]
        int topla(int x1, int x2);

        [OperationContract]
        int cikart(int x1, int x2);
    }

MathLibService.cs

    public class MathLibService : IMathLib
    {

        public int topla(int x1, int x2)
        {
            return x1 + x2;
        }

        public int cikart(int x1, int x2)
        {
            return x1 - x2;
        }
    }

app.config

        <system.serviceModel>
		<services>
			<service behaviorConfiguration="WCFServiceIISHost.Service1Behavior"
			  name="WCFServiceIISHost.MathLibService">
				<endpoint address="" binding="basicHttpBinding" name="basicEndpoint"
				  contract="WCFServiceIISHost.IMathLib" />
				<endpoint address="mex" binding="mexHttpBinding" name="mexEndpoint"
				  contract="IMetadataExchange" />
			</service>
		</services>
		<behaviors>
			<serviceBehaviors>
				<behavior name="WCFServiceIISHost.Service1Behavior">
					<serviceMetadata httpGetEnabled="True"/>
					<serviceDebug includeExceptionDetailInFaults="False" />
				</behavior>
			</serviceBehaviors>
		</behaviors>
	</system.serviceModel>

App.config’te gördüğünüz gibi binding tipi basichttpbinding olan endpoint’e adres vermedik bunun sebebi ise “.svc” dosyası adres olayını kendi içinde halleder.

Dikkat edilecek bir diğer olay ise service tagindeki name attribute ‘ teki değer ile .svc dosyasındaki  Service tagindeki değer aynı olmalıdır.

Sırasıyla aşağıdaki işlemleri uygulayalım.

1-Projemize bir tane TextFile ekleyip uzantısını .svc yapalım sonra içeriğini aşağıdaki gibi değiştirelim.

<%@ ServiceHost Language="C#" Debug="true" Service="WCFServiceIISHost.MathLibService" %>

svc file

2-Projeyi Publish edelim.Bunun için ben masaüstünde bir klasör açıp içine attım dosyaları.

iishost2

3-Şimdi IIS Manager de Application oluşturup yol olarak masaüstünde açtığımız bu klasörü gösterelim.

iishost4

4-Daha sonra masaüstünde oluşturulan klasöre Properties>Security>Edit deyip IIS_USRS,IUSR kullanıcılarını ekleyip Read&Execute yetkilerini verelim

iishost5

5-Son Adım olarak “.svc” dosyasının yolunu browsera yazarak servisimize ulaşabiliriz.

Untitled

Bu makalemde Windows Service üserinde, Console Uygulamasında ve IIS üzerinde nasıl host edildiğinden bahsettim.

 

Kaynaklar

1-http://www.codeproject.com/Articles/150066/Create-Host-Self-Hosting-IIS-hosting-and-Consume-W

2-http://msdn.microsoft.com/en-us/library/ms733766.aspx

3-http://www.buraksenyurt.com/post/WCF-Adc4b1m-Adc4b1m-IIS-Hosting-bsenyurt-com-dan.aspx

4-Pro WCF 4 Practical Microsoft SOA Implementation

WCF Host Sample
WCF Host Sample
WCFHostSample.rar
6.0 MiB
71 Downloads
Ayrıntılar...