Daha öncede bahsettiğimiz üzre IIS 7.0 ve WAS sayesinde msmq,tcp,pipe,http gibi protokolleri kullanan uygulamaları IIS üzerinden host edebiliyorduk. Bunun bize kazandıracağı en büyük avantaj ise şimdilik host edebilmeinin rahatlığı ve IIS in tüm nimetlerinden yararlanabilme olarak gözüküyor. Fakat windows servisler kadar performanslı olmadığıda kabul edilmiş bir gerçek.
Programımızı yazmaya başlamadan önce yapmamız gerekn ön hazırlıklar var. Windows Vista veya Server 2008 de Windows özelliklerinden WAS ı aktif hale getiriyoruz. Daha sonra “.NET Framework 3.0 ->Non-Http Activation” ı da aktif hale getiriyoruz. Aşağıdaki resimde de yapılacak işlem açıkca görülmektedir.
Sonrasında yeni bir proje açarak, uygulamamıza başlıyoruz. Açacağımız uygulama WCF Service Application olacak. Bu proje templatinde hazır yazılmış bir WCF servisi otomatik ekleniyor. Bizde kodu çok fazla bozmadan sadece tcp end point ekleyeceğiz. Bu işlemi VS 2008 ile birlikte gelen WCF Configuration editleme ekranı yardımıyla yapacağız.
Ardından servisimize yeni bir endpoint ekliyoruz. Binding tipi olarak “netTCPBinding” seçiyoruz.
Bu işlem sonrasında kofigürasyon dosyamıza baktığımızda şu şekilde olduğunu görüyoruz. Üç tane endpointimiz var. Bunlardan ikisi template ile beraber gelen http endpointi ve mex endpointi. Üçüncü endpoint ise bizim eklediğimiz tcp endpoint olmaktadır.
<system.serviceModel>
<services>
<service behaviorConfiguration="TcpWAS.Service1Behavior" name="TcpWAS.Service1">
<endpoint address="" binding="wsHttpBinding" name="wsHttpEP" contract="TcpWAS.IService1" />
<endpoint address="mex" binding="mexHttpBinding" name="mexHttpEP" contract="IMetadataExchange" />
<endpoint binding="netTcpBinding" bindingConfiguration="" name="netTcpEP" contract="TcpWAS.IService1" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="TcpWAS.Service1Behavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
<services>
<service behaviorConfiguration="TcpWAS.Service1Behavior" name="TcpWAS.Service1">
<endpoint address="" binding="wsHttpBinding" name="wsHttpEP" contract="TcpWAS.IService1" />
<endpoint address="mex" binding="mexHttpBinding" name="mexHttpEP" contract="IMetadataExchange" />
<endpoint binding="netTcpBinding" bindingConfiguration="" name="netTcpEP" contract="TcpWAS.IService1" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="TcpWAS.Service1Behavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
Ardından IIS de bir web application oluşturup, dizin olarakta yazdığımız servisi gösteriyoruz. Fakat IIS üzerinde yapılacak işlemler bununla bitmiyor.
IIS de yaratmış olduğumuz uygulamada default olarak sadece http desteği geliyor. tcp desteğini sağlamak içinde komut satırına aşağıdaki komutu yazıyoruz.
%windir%\system32\inetsrv\appcmd.exe set app "Default Web Site/TcpWAS" /enabledProtocols:http,net.tcp
Bu komutun yaptığı iş IIS konfigürasyon dosyasına ilgili site için gerekli izinleri sağlamak.
IIS Konfigürasyon dosyası için; %windir%\system32\inetsrv\config komutu yazılıp bu dosya incelenebilir. Yapılan değişikler sonrası IIS konfigürasyon dosyasında uygulamamıza ait kısımda “enabledProtocols” özelliğine net.tcp ninde eklendiğini görüyoruz.
<application path="/TcpWAS" enabledProtocols="http,net.tcp">
<virtualDirectory path="/" physicalPath="C:\Users\osimsek\Desktop\WCFDemo\TcpWAS\TcpWAS\TcpWAS" />
</application>
<virtualDirectory path="/" physicalPath="C:\Users\osimsek\Desktop\WCFDemo\TcpWAS\TcpWAS\TcpWAS" />
</application>
Ardından Client uygulamamızı yazmaya başlıyoruz:
Bir console application yaratıyoruz ve hemen ardından; servisimizi referans olarak ekliyoruz. Burada adres olarak http endpointi kullanabiliriz.
Sonrasında client tarafında oluşturlan tcp endpointi kullanarak servisimizi çağırıyoruz.
Service1Client client = new Service1Client("netTcpEP");
while (true)
{
Console.WriteLine("A number please!");
Console.WriteLine(client.GetData(Convert.ToInt32(Console.ReadLine())));
}
{
Console.WriteLine("A number please!");
Console.WriteLine(client.GetData(Convert.ToInt32(Console.ReadLine())));
}
Çıktı:
Sonuç olarak TCP üzerinden çalışan ve IIS üzerinde host ettiğimiz bir servisimiz oldu. Bir sonraki makalemizde görüşmek dileğiyle “esen kalın:)”
Örneği indirmek için tıklayınız.
Hiç yorum yok:
Yorum Gönder