Matematik Mühendisi, MBAci, eski MVP, blogger, @nedirtv editörü. Turuncu sakallı bir yazılımcı. Çalışması zor, detaycı, huysuz, yaşlı. C#, Ruby, Python, GoLang sevdalısı.
Oturum Aç
Sayfalarım
Almanac
Ben Kimim?
Java ile 24 Kahve Molası Dökümanı
Tag Bulutu
.net
.net core
.net core 2.0
.net framework
.net framework 4.0
.net remoting
.net ria services
ado.net
ado.net 2.0
ado.net data services
ado.net entity framework
ado.net entity framework 4.0
algorithms
api
asp.net
asp.net 2.0
asp.net 4.0
asp.net 4.5
asp.net core
asp.net web api
async
asynchronous programming
attribute
await
azure
bizspark
c#
C#
c# 3.0
c# 4.0
c# temelleri
class
client object model
cloud computing
clr
common language runtime
container
crud
cryptography
database
datatable
delegate
delete
dependency injection
design patterns
design principles
docker
dotnet
dynamic
entity framework
etkinlik
express
extension methods
fluent api
Framework
gelişim atölyesi
generic
get
go
go programming language
golang
google cloud platform
hello world
html
http
http get
http post
httpwebrequest
httpwebresponse
IoT
inheritance
interface
io
java
javascript
jquery
json
language integrated query
linq
linux
microservice
microsoft
microsoft teknoloji günleri
mvc
nedir?tv
nedirtv
nedirtv?com
nedirtv?com söyleşileri
newtonsoft
node
node.js
nodejs
non soap
nosql
npm
nuget
object oriented programming
odata
oledb
oop
parallel programming
plinq
post
postman
python
query
reflection
rest
rest api
rest services
restful
ruby
ruby kod parçacıkları
screencast
scrum
security
seminer
serialization
service
silverlight
soa
soap
sql
sqlite
struct
task
task parallel library
tdd
team foundation server
tek fotoluk ipucu
test driven development
tfs
thread
tpl
type
ubuntu
unit test
visual studio
visual studio 2010
visual studio 2010 ultimate
visual studio code
wcf
wcf 4.0
wcf data services
wcf eco system
wcf ria services
wcf webhttp services
web api
webcast
webhttp services
webiner
websockets
wf
wf 4.0
windows communication foundation
windows forms
workflow foundation
workflow foundation 4.0
workflow services
wpf
xml
xml web service
xml web services
Kategoriler
.Net Core (48)
.Net Framework 4.0 (15)
.Net Framework 4.5 (7)
.Net Remoting (11)
.Net RIA Services (5)
.Net Temelleri (4)
Ado.Net (47)
Ado.net 2.0 (12)
Ado.Net Data Services (11)
Ado.Net Sync Services (1)
Algoritma (6)
Angular (5)
Anti Patterns (2)
Asp.Net (18)
Asp.Net 2.0 (26)
Asp.Net 4.0 (5)
Asp.Net 4.0 Beta 2 (3)
Asp.Net 4.5 (7)
Asp.Net Core (10)
Asp.Net Web API (10)
AWS (3)
Azure (5)
BCL (1)
bing (2)
Biztalk (1)
Blazor (1)
C# (153)
C# 3.0 (9)
C# 4.0 (27)
C# 6.0 (2)
C# 7.0 (2)
CodeKata (2)
Dart (1)
Data Structures, Algorithms (5)
Deneyimler (2)
Developers Tube (3)
DevOps (3)
Dokuman (4)
Eğitimler (10)
Elasticsearch (1)
Enterprise Library (1)
Entity Framework (29)
GCP (4)
GoLang (28)
Journal (6)
Kitap Tavsiyelerim (4)
LINQ (9)
LINQ to SQL (4)
Motoko (1)
NedirTv? (23)
Node.js (19)
NoSQL (11)
Office Development (2)
Parallel Programming (21)
PLINQ (5)
Podcasts (6)
Powershell (2)
python (14)
Raspberry Pi (6)
React (3)
REST (6)
Ruby (52)
Rust (2)
Scala (1)
Seminerler (40)
Silverlight 4.0 (9)
SOA (3)
Spring Boot (3)
T SQL (6)
Tasarım Kalıpları(Design Patterns) (19)
Tasarım Prensipleri(Design Principles) (11)
Team Foundation Server (10)
Tek Fotoluk Ipucu (140)
Teknik Dışı Konular (21)
TPL (14)
Velocity Project (1)
Visual Studio (3)
Vue.js (4)
WCF (84)
WCF 4.0 (14)
WCF 4.0 Beta 1 (18)
WCF 4.0 Beta 2 (2)
WCF 4.0 RC (1)
WCF 4.5 (8)
WCF Data Services (5)
WCF Eco System (23)
WCF Öğreniyorum (4)
WCF RIA Services (11)
WCF WebHttp Services (13)
WF (12)
WF 4.0 (8)
WF 4.0 Beta 1 (5)
WF 4.0 Beta 2 (12)
WF 4.0 RC (4)
Windows Azure (3)
Windows Forms (4)
Windows Mobile (1)
Windows Phone 7 (1)
Windows Server AppFabric (2)
Windows Services (4)
Workflow Foundation Öğreniyorum (15)
WPF (12)
XML (2)
XML Web Services (13)
Aylık Durum
2021
Ekim (1)
Mayıs (4)
Nisan (2)
Mart (1)
2020
Aralık (5)
Kasım (3)
Ekim (4)
Eylül (2)
Ağustos (1)
Temmuz (2)
Haziran (2)
Mayıs (4)
Nisan (1)
Şubat (1)
Ocak (2)
2019
Aralık (4)
Kasım (2)
Ekim (1)
Eylül (3)
Ağustos (5)
Temmuz (3)
Haziran (4)
Mayıs (7)
Nisan (6)
Mart (2)
Şubat (2)
Ocak (3)
2018
Aralık (2)
Kasım (5)
Ekim (4)
Eylül (4)
Ağustos (5)
Temmuz (5)
Haziran (2)
Mayıs (4)
Nisan (3)
Mart (3)
Şubat (4)
Ocak (5)
2017
Aralık (4)
Kasım (3)
Ekim (4)
Ağustos (2)
Temmuz (6)
Haziran (7)
Mayıs (9)
Nisan (7)
Mart (5)
Şubat (7)
Ocak (9)
2016
Aralık (7)
Kasım (5)
Ekim (7)
Eylül (4)
Ağustos (1)
Temmuz (1)
Haziran (6)
Mayıs (5)
Nisan (5)
Mart (3)
Şubat (5)
Ocak (5)
2015
Aralık (4)
Kasım (7)
Ekim (1)
Eylül (4)
Ağustos (12)
Temmuz (1)
Haziran (9)
Mayıs (2)
Nisan (4)
Mart (2)
Şubat (1)
Ocak (3)
2014
Aralık (5)
Kasım (4)
Ekim (4)
Eylül (3)
Ağustos (3)
Temmuz (3)
Haziran (4)
Mayıs (2)
Nisan (3)
Mart (7)
Şubat (4)
Ocak (4)
2013
Aralık (2)
Kasım (4)
Ekim (4)
Eylül (3)
Ağustos (4)
Temmuz (4)
Haziran (10)
Mayıs (4)
Nisan (5)
Mart (26)
Şubat (8)
Ocak (7)
2012
Aralık (6)
Kasım (14)
Ekim (4)
Eylül (9)
Temmuz (12)
Haziran (7)
Mayıs (8)
Nisan (6)
Mart (8)
Şubat (8)
Ocak (8)
2011
Aralık (8)
Kasım (10)
Ekim (8)
Eylül (6)
Ağustos (8)
Temmuz (11)
Haziran (11)
Mayıs (1)
Nisan (8)
Mart (5)
Şubat (6)
Ocak (5)
2010
Aralık (6)
Kasım (6)
Ekim (6)
Eylül (10)
Ağustos (9)
Temmuz (10)
Haziran (12)
Mayıs (10)
Nisan (13)
Mart (18)
Şubat (11)
Ocak (14)
2009
Aralık (12)
Kasım (15)
Ekim (14)
Eylül (8)
Ağustos (20)
Temmuz (14)
Haziran (15)
Mayıs (14)
Nisan (17)
Mart (2)
Şubat (2)
Ocak (3)
2008
Aralık (1)
Ekim (4)
Eylül (2)
Ağustos (1)
Temmuz (1)
Haziran (3)
Mayıs (2)
Nisan (3)
Mart (4)
Şubat (4)
Ocak (4)
2007
Aralık (4)
Kasım (4)
Ekim (5)
Eylül (4)
Ağustos (5)
Temmuz (5)
Haziran (4)
Mayıs (5)
Nisan (4)
Mart (5)
Şubat (4)
Ocak (3)
2006
Aralık (4)
Kasım (3)
Ekim (4)
Eylül (3)
Ağustos (1)
Temmuz (4)
Haziran (3)
Mayıs (3)
Nisan (4)
Mart (5)
Şubat (4)
Ocak (3)
2005
Aralık (1)
Kasım (2)
Ekim (2)
Eylül (3)
Ağustos (2)
Temmuz (4)
Haziran (6)
Mayıs (1)
Nisan (3)
Mart (3)
Şubat (2)
Ocak (2)
2004
Aralık (3)
Kasım (3)
Ekim (5)
Eylül (16)
Ağustos (3)
Temmuz (5)
Haziran (4)
Mayıs (3)
Nisan (5)
Mart (4)
Şubat (8)
Ocak (18)
2003
Aralık (20)
Kasım (10)
1976
Aralık (1)
1903
Mart (1)
Son Yorumlar
Birisi Sana "Blazor Nedir?" Diye Sorarsa (3)
Abdurrahman Güngör yazdı: Oldukça detaylı, işin mantığını, teorisini başarıy...
.Net' e Nereden Başlamalıyım? (12)
Merve Çetin yazdı: Tertemiz bir makale olmuş hocam kaleminize sağlık....
Satranç ve ELO Puanlama Sistemi (4)
Zek yazdı: Çok aydınlatıcı
Duck Typing Nedir? (4)
Ahmet Berke Tuncel yazdı: "GoLang - Interface Kavramı" yazısından ...
Sql Tablolarına Resim Eklemek (5)
Smallow yazdı: Hocam grid viewe aktardım ben fotoğrafları. bunu g...
Bir Web API Hizmetinde Talepler ile CQ Arasında Mediator Kullanmak (1)
murat dinlemez yazdı: Hocam elinize sağlık. O kadar güzel anlatım olmuş ...
Ado.Net 2.0 ve SqlDependency Sınıfı Yardımıyla Query Notification (8)
Mehmet Özdemir yazdı: using System.Data; using System.Data.SqlClient; ...
Raspberry PI Derken Oluşan Python Çalışma Notlarım (4)
Şerafettin yazdı: Mrb, RPi da kurulu olan python modüllerinin isiml...
for mu, foreach mi? Yoksa Parallel.For mu, Parallel.ForEach mi? [Beta 1] (3)
Iz yazdı: Gözəl izah etmisiniz. Təşəkkürlər!
Docker Yerine Podman (Pod Manager) Kullanmak (1)
Tagi yazdı: Güzel bir yazı olmuş. Teşekkürler
Comment RSS
Copyright © 2021
Powered by BlogEngine.NET
Designed by Francis Bio
← C# Temelleri - Olayları(Events) Kavramak
WCF - InstanceContextMode →
WCF - One Way Ticket
31 Mayıs 2007 Burak-Selim-Senyurt WCF
Değerli Okurlarım Merhabalar,
One Way Ticket...One Way Ticket... Bu sözleri duyduğumda aklıma bu şarkıyı yapan eruption ve cover versiyonunu söyleyip efsaneleşen Boney M grupları gelir. Ancak One Way ikilisi ne tesadüftürki .Net Remoting mimarisinde de karşımıza çıkmaktadır. Kısaca tek yön olarak çevirebileceğimiz bu iki kelime aslında fırlat ve unut(fire and forget) anlamındada düşünülebilir. Yada bir başka deyişle istemci tarafından olaya bakıldığında, "metodu çağırdım gerisi umrumda değil" de denebilir. Aynı kelimelerin Windows Communication Foundation içerisinde de yer alması elbetteki şaşırtıcı değildir. Nitekim One Way operasyonlar aslında asenkron istemci-sunucu modelininde önemli bir parçasıdır.
Normal şartlarda Windows Communication Foundation istemcileri servisten bir talepte bulunduklarında, proxy tarafından hazırlanan mesaj sunucuya gönderilir. Servis gelen mesajı alır, çözümler ve gereken yürütme işlemlerini gerçekleştirir. Burada söz konusu yürütmeye dahil olan metodların çalıştırılmasının sonucunda istemciye bu işlemin tamamlandığı bilgisi eğer geri dönüş değeri var ise onunla birlikte döner. Bu, talep/cevap mesajlaşma deseni (request/response messaging pattern) olarak adlandırılan klasik çalışma modelidir. Ancak burada istemcinin çağrıda bulunduğu metodun tamamlanışını beklemesi gerekir. Aksi takdirde ilerlemesi söz konusu değildir. Burada bahsi geçen konu kod satırında bir alt ifadeye geçilememesidir. Çok doğal olarak servis tarafındaki metodun çalışmasının uzun sürdüğü durumlarda istemci uygulama beklemede olacaktır.
Özellikle istemci tarafındaki uygulamaların çağrıda bulundukları metodlar geriye değer döndürmüyorlarsa asenkron programlama (asynchronous programmin) adına One Way tekniğinden yararlanılabilir. One Way tekniği uygulanması kolay olmasına rağmen dikkat edilmesi gereken noktalara sahiptir. İşte bu makalemizde söz konusu noktalara değinerek One Way tekniğinin WCF açısından detaylarını görmeye çalışacağız.
İstemci programların uzak metod çağrımlarında uygulamaları duraksatmasını engellemek adına kullanılabilecek tek yol One Way değildir. Diğer Asenkron erişim modelleride ele alınabilir. Bunlar ilerleyen makalelerimizde ele alınacaktır. One Way ve diğer asenkron modellerinde istemci ve sunucu uygulamaların aynı zaman diliminde çalışıyor olmaları gerekir. Bunun aksi bir durumda ise Message Queue sisteminin kullanılmasında fayda vardır.
One Way formasyonuna uygun bir çağrım için OperationContract niteliğinin IsOneWay özelliğine true değerini aktarmak yeterlidir. OneWay metodlar ile ilişkili bilinmesi gereken öncelikli kurallar vardır. Herşeyden önce OneWay olarak işaretlenenen metodlar geri dönüş değerine sahip olmazlar. Bir başka deyişle bu metodlar void olarak tanımlanırlar. Burada metoda parametre olarak ref veya out tipinden aktarımlar yapılmak istenebilir ancak buda mümkün değildir. Diğer taraftan söz konusu metodlar içerisinde çok doğal olarak istisnalar(Exceptions) olabilir. Burada söz konusu olan SOAP hata mesajları (SOAP Fault Message) istemci tarafına gönderilmez. Bu sebeplerden ötürü istemci servis üzerindeki metodun başarılı bir şekilde tamamlanıp tamamlanmadığını asla bilemez.
Ancak en azından istemcinin gönderdiği metod çağrısı mesajının servise ulaşıp ulaşmadığının bilinmesinde yarar vardır. Eğer servis uygulaması çalışmıyorsa çok doğal olarak istemci bir istisna alacaktır ki bu durumda istemciden gönderilen talebin ulaşmadığı zaten doğrudan anlaşılabilir. Ancak bazı iletişim protokollerinde (örneğin Tcp) gelen mesajlar tampona alınırarak işlenirler. Arka arkaya gelen bu taleplere ait mesajların toplu olarak bir maksimum sayısı vardır. Sonuçta birden fazla istemci söz konusudur ve bunların gönderecekleri sayısız çağrı bulunmaktadır.
Böyle bir durumda eğer servis tarafında kabul edilebilen maksimum talep sayısı aşılırsa gelen yeni talepler var olan yarım kalmışlar tamamlanıncaya kadar beklemeye alınır. Dolayısıyla istemci uygulama her ne kadar OneWay çağrısı yapsada beklemede kalır. Bu durumla başedebilmek için güvenilir oturumlar (Reliable Session) açılmasında fayda vardır. Güvenilir oturumlar sayesinde servis, bir çağrı aldığında gelen mesajı işlemeye başladığına dair istemciye bilgi gönderebilir.
One Way tekniği istemci için önem arz eden SendTimeout sürelerini önemsemez. Normal şartlarda istemciler bir metod çağrısında bulunduklarında varsayılan olarak 1 dakikalık bir timeout süreleri vardır. Eğer bu süre içerisinde servisten bir cevap gelmesse otomatik olarak TimeoutException tipinden bir çalışma zamanı hatası alınır. One way operasyonlarında çok doğal olarak bu tip bir süre kontrolü önemli değildir. Nitekim istemci tarafı çağrıda bulunduğu metod için bir cevap beklememektedir. Ama varsayılan olarak bazı aksilikler olacaktır ki ilerleyen kısımlarda buna değinmeye çalışacağız.
Şimdi örnek bir uygulama üzerinden ilerleyerek One Way tekniğini nasıl ele alabileceğimizi inclemeye çalışacak ve dikkat edilmesi gereken durumları analiz edeceğiz. Bu makalemizdeki örneğimizde, file-based olarak web üzerinde barındırılan bir servis uygulaması yer alacaktır. İstemciyi olayları kolay bir şekilde takip edebilmek adına bir konsol uygulaması olarak tasarlayabiliriz. Burada diğer makalelerimizden farklı olarak wsHttpBinding bağlayıcı tipini ele alacağız. Bu tip aslında BasicHttpBinding bağlayıcı tipine benzerdir ancak güvenilir oturumlara (reliable sessions) sahip, transcation yönetimine izin veren Http ve Https iletişim protokollerinin kullanılabildiği, WS-Adressing işlemlerin yapılabildiği bir ortam sunarak ekstra imkanlar sağlar.
Geliştirilecek servis uygulaması için WCF Service şablonu kullanılabilir. Bu amaçla ilk olarak Visual Studio 2005 ile aşağıdaki gibi bir servis uygulaması açarak işe başlanmalıdır. WCF Service uygulaması file-based olarak host edileceğinden ve istemcilerin tek bir adresten ilgili servise erişmeleri istendiğinden projenin Properties penceresindeki özelliklerden port numarası sabit bir değere ayarlanabilir. Bu işlem için öncelikle Dynamic Ports özelliğine false değer atamak gerekir.
Servisimiz için gerekli tiplerimizi ise aşağıdaki gibi geliştirebiliriz. Söz konusu tipler App_Code klasörü içerisinde yer almaktadır.
IRaporUretici Arayüzü İçeriği;
[ServiceContract(Name = "RaporlamaServisi", Namespace = "http://www.bsenyurt.com/RaporlamaServisi/2007/30/05")]
public interface IRaporUretici
{
    [OperationContract(IsOneWay = true)]
    void RaporUret(string kullaniciAdi);
    [OperationContract(IsOneWay = true)]
    void SatisYapildi(int productId);
}
RaporUretici sınıfı içeriği;
public class RaporUretici
               : IRaporUretici
{
    #region IRaporUretici Members

    public void RaporUret(string kullaniciAdi)
    {
        Thread.Sleep(65000); // 1 dakika 5 saniye duraksatma
        FileStream fs = new FileStream("C:\\Izleme.txt", FileMode.Append, FileAccess.Write);
        StreamWriter writer = new StreamWriter(fs);
        writer.WriteLine(kullaniciAdi + " İÇİN RAPOR ÜRETME EMRİ VERİLDİ");
        writer.Close();
        fs.Close();
    }

    public void SatisYapildi(int productId)
    {
        Thread.Sleep(65000); // 1 dakika 5 saniye duraksatma
        FileStream fs = new FileStream("C:\\Izleme.txt", FileMode.Append, FileAccess.Write);
        StreamWriter writer = new StreamWriter(fs);
        writer.WriteLine(productId + " ÜRÜNÜ İÇİN SATIŞ YAPILDI");
        writer.Close();
        fs.Close();
    }

    #endregion
}
Arayüz tanımlaması içerisinde dikkat edilecek olursa OperationContract niteliğinin IsOneWay özelliğine true değeri atanmıştır. Servis sözleşmesini uygulayan sınıf içerisinde sembolik olarak iki metod yer almaktadır. Özellikle bu metodların içerisinde Thread sınıfının static Sleep metodu yardımıyla uygulama 65 saniye duraksatılmaktadır. Burada 1 dakikalık TimeOut sınırının aşılmasının doğuracağı bazı sonuçlar olacaktır. Bu sonuçlar ilerleyen kısımlarda ele alınacaktır. Servis tarafında yer alan web.config dosyasının içeriği aşağıdaki gibi tasarlanabilir.
web.config içeriği;
<?xml version="1.0"?>
<configuration>
    <system.serviceModel>
        <services>
            <service behaviorConfiguration="RaporlamaServisiBehavior" name="RaporlamaServisi.RaporUretici">
                <endpoint address="http://localhost:2215/RaporlamaServisi/Service.svc" binding="wsHttpBinding" bindingConfiguration="" name="RaporlamaServisiEndPoint" contract="RaporlamaServisi.IRaporUretici" />
            </service>
        </services>
        <behaviors>
            <serviceBehaviors>
                <behavior name="RaporlamaServisiBehavior">
                    <serviceMetadata httpGetEnabled="true"/>
                </behavior>
            </serviceBehaviors>
        </behaviors>
    </system.serviceModel>
    <system.web>
        <compilation debug="true"/>
    </system.web>
</configuration>
Servis web tabanlı olarak host edildiğinden svc uzantılı bir dosyanında var olması gerekmektedir. Bu dosyanın içeriğinde servis sözleşmesini uygulayan sınıfın adı ve fiziki dosya adı aşağıdaki gibi yer alır.
Service.svc;
<% @ServiceHost Language=C# Debug="true" Service="RaporlamaServisi.RaporUretici" CodeBehind="~/App_Code/Service.cs" %>
Servis ile ilgili işlemlere geçmeden önce çalıştığından emin olmakta fayda vardır. Servis başarılı bir şekilde hazırlanmışsa aşağıdaki ekran görüntüsünün elde edilmesi gerekir.
Artık istemci için gerekli kodlar yazılıp testlere başlanabilir. Öncelikli olarak istemci uygulamalar için gerekli proxy tipinin üretilmesi gerekir. Bunun için komut satırında (Visual Studio 2005 Command Prompt) svcutil.exe aracı kullanılabilir yada Visual Studio 2005 ortamında konsol uygulamasında Add Service Reference seçeneği ile aşağıdaki ekran görüntüsünde olduğu gibi eklenebilir.
Bu işlemin ardından istemci uygulamasına ait proje içerisinde gerekli proxy tipi ve App.config konfigurasyon dosyası üretilmiş olacaktır.
İstemci uygulamaya ait kodlar aşağıdaki gibi geliştirilebilir.
using System;
using System.Text;
using System.ServiceModel;
using System.Collections.Generic;
using Istemci.localhost;

namespace Istemci
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                RaporlamaServisiClient srv = new RaporlamaServisiClient("RaporlamaServisiEndPoint");
                Console.WriteLine("Rapor üretimini başlat..." + DateTime.Now.ToString());
                srv.RaporUret("Mayk");
                Console.WriteLine("Rapor üretimi başlatıldı..." + DateTime.Now.ToString());
                Console.WriteLine("Ürün satışı yapıldı bilgisini gönder..." + DateTime.Now.ToString());
                srv.SatisYapildi(1001);
                Console.WriteLine("Ürün satışı yapıldı bilgisi gönderildi..." + DateTime.Now.ToString());

                srv.Close();
            }
            catch (Exception hata)
            {
                Console.WriteLine(hata.Message);
            }
        }
    }
}
RaporlamaServisiClient nesnesi örneklendikten sonra RaporUret ve SatisYapildi isimli metodlar çağırılmaktadır. Bu metodları işaret eden servis sözleşmesinde OneWay oldukları belirtilmiştir. Buna göre istemci uygulamanın, bu metodlar içerisindeki 65 saniyelik sürelerden etkilenmeden diğer kod satırlarını işletmesi gerekmektedir. Bakalım gerçekten böyle mi olacak?
Testleri yapabilmek için hem sunucu uygulamanın hemde istemci uygulamanın aynı zaman diliminde çalışıyor olmaları gerekmektedir. Dolayısıyla Solution özelliklerinde Multiple Startup Projects seçilmeli ve önce servis uygulaması ardından istemci uygulama çalışacak şekilde ayarlanmalıdır.
Bu aşamadan sonra uygulama çalıştırılırsa ilk etapta aşağıdaki gibi bir ekran görüntüsü ile karşılaşılır.
Görüldüğü gibi RaporUret çağrısı kolayca aşılmış ancak, SatisYapildi çağrısından sonra istemci uygulama ekranı duraksamıştır. Oysaki ikinci metodda OneWay olarak çağrılmaktadır. Dolayısıyla aynen ilk metod çağrısında olduğu gibi buradada istemci uygulamanın diğer kod satırlarından işlemlerine devam etmesi beklenir. Ne varki böyle olmamıştır. Sonuç olarak bir süre bekledikten sonra aşağıdaki ekranda görülen hata mesajı ile karşılaşılır.
Peki sorun nedir? İstemci uygulama neden çalışma zamamında bir istisna alarak sonlanmıştır? Hatta yeterli süre beklenildiğinde sunucu tarafında Izleme.txt dosyasının içeriğine bakıldığında metod içeriklerinin çalıştığıda gözlemlenebilir.
Ne varki istemci açısından bazı sorunlar olduğu ortadadır. Problemin nedeni oturumlardır (Sessions). Aynı oturum içerisinde gelen arka arkaya iki çağrı söz konusudur. Bu çağrılar doğal olarak aynı andalık ilkesine (Concurrency) göre değerlendirilir. Dolayısıyla ikinci çağrıdan sonra istemci uygulama, ilk çağrı sonucunun tamamlanmasını beklemek durumunda kalmıştır. Bu sebepten servisin özellikle aynı oturum içerisinden gelecek eş zamanlı metod çağrılarına cevap verebilecek şekilde özelleştirilmesi gerekir. Burada elebetteki Session moddan vazgeçilmesi tercih edilebilir. Örneğin PerCall mode seçilebilir. Ancak oturumların (Sessions) kullanım amaçları göz önüne alındığında bir çözüm yolu bulunmasında fayda vardır. Yapılması gereken servis sözleşmesini uygulayan RaporUretici sınıfına, ServiceBehavior niteliğini uygulamak ve ConcurrencyMode özelliğine Multiple değerini aşağıdaki gibi vermektir.
namespace RaporlamaServisi
{
    [ServiceBehavior(ConcurrencyMode= ConcurrencyMode.Multiple)]
    public class RaporUretici
                        : IRaporUretici
    {
Uygulamamızı bu haliyle test ettiğimizde ise aşağıdaki ekran görüntüsü ile karşılaşırız.
Herşey ilk etapta yolunda gibidir. Nitekim SatisYapildi metod çağrısı sonrasındaki kodlarda çalışmıştır. Ancak uygulama kapanırken yine bir hata mesajı alınmıştır. Bu hata mesajının üretildiği nokta istemci tarafında servis için Close metodunun çağrıldığı yerdir. Bu çağrıya gelindiğinde istemci uygulama uzun bir süre beklemede kalmıştır. Sonrasında ise bir istisna mesajı fırlatarak sonlanmıştır. Bunun sebebi kullanılan WsHttpBinding tipinin özellikleridir. WsHttpBinding oturumları kullanan ve varsayılan olarak mesaj seviyesinde güvenlik (Message-Level Security) kullanan bir bağlayıcı (Binding) tipidir.
İstemci Close metodunu çağırdığında servis tarafında kendisi için açılan oturumu(Session) kapatmak ister. Buna karşılık servis ilgili oturuma ait işlemlerin bitmesini bekler ve tamamlandıklarından emin olduktan sonra bunu istemciye bir mesaj ile bildirir. Örnekte çok doğal olarak servis tarafındaki işlemler 1 dakika sınırını aştığından, söz konusu mesaj istemciye iletilemez. Buda doğal olarak istemci tarafında bir istisna mesajı fırlamasına neden olur. Çözüm olarak güvenlik ile ilgili ayarlar kapatılabilir ki bu önerilen bir yöntem değildir. Diğer bir yöntem ise iletişim seviyesinde güvenlik (transport levet security) kullanmaktır. Ancak bu yöntemde sertifika kullanılması gerekir nitekim Https politikası söz konusudur.
Ancak mesaj seviyesinde yapılabilecek bir seçenek daha vardır. Buda güvenilir bir oturum (Reliable Session) açmaktır. Nitekim bu sayede istemcinin yaptığı çağrılar sonucu servisten bir bilgi beklenmesine gerek kalmayacaktır. Bunun için servis tarafında ve istemci tarafında wsHttpBinding tipi için konfigurasyon ayarları yapılmalı ve ReliableSession için Enabled özelliklerine true değeri atanmalıdır. Aşağıdaki ekran görüntüsünde servis tarafı için ilgili değişikliklerin Microsoft Service Configuration Editor yardımıyla nasıl yapıldığı gösterilmektedir.
Bu değişiklikler sonucu servis tarafı için konfigurasyon dosyasının içeriği aşağıdaki gibi olur.
Benzer değişikliklerin istemci tarafı içinde yapılması gerekir. Bunun sonucu olarak istemci tarafındaki konfigurasyon dosyasındada aşağıdaki değişiklikler olacaktır.
Artık uygulamımızı bu haliyle test edebiliriz. Aşağıda uygulamanın son halinin test sonuçlarına ait ekran görüntüsü yer almaktadır.
Sonuç itibariyle basit bir One Way Ticket şarkısından oldukça farklı noktalara geldik. Bu ana kadar gördüklerimizden aşağıdaki sonuçları çıkartabiliriz.
OneWay tekniği ile Windows Communication Foundation uygulamalarında asenkron çağırımlar gerçekleştirilebilir ve performans artışı sağlanır. Çünkü istemci uygulama, servis tarafındaki metod sonuçlarını beklemeden yoluna devam eder.
Günvenilir oturumlara (Reliable Sessions) izin verilmesi halinde istemci tarafında Close metodu uygulandığında servis ile olan bağlantı(Connection), servisten cevap beklenmeden sonlandırılabilir.
Özellikle oturum(Session) kullanıldığı durumlarda servis üzerinde aynı oturuma ait arka arkaya metod çağırımlarında, istemci uygulamanın duraksamasını engellemek adına ConcurrencyMode özelliğinin değeri Multiple olarak set edilebilir.
ConcurrencyMode özelliğinin Multiple olarak belirlenmesi halinde servisin gerçektende thread-safe olup olmadığına dikkat edilmelidir. Nitekim Multiple değeri ile, servis tarafındaki uygulama Multi-Thread hale gelmektedir.
Bu makalemizde asenkron programlama çeşitlerinden birisi olan One Way metod çağırım tekniğini incelemeye çalıştık. Asenkron programlamaya ilişkin başka örnekleri ilerleyen makalelerimizde incelemeye çalışacağız. Böylece geldik bir makalemizin daha sonuna. Bir sonraki makalemizde görüşünceye dek hepinize mutlu günler dilerim.
Örnek Uygulama İçin Tıklayınız.
Etiketler : wcf, windows communication foundation
2e95731c-c0dd-469e-b6df-80a57dba12c6|11|4.6|96d5b379-7e1d-4dac-a6ba-1e50db561b04
İlişkili yazılar
WCF - One Way Ticket
One Way Ticket...One Way Ticket... Bu sözleri duyduğumda aklıma bu şarkıyı yapan eruption ve cover v...
WCF WebHttp Services - Client Tarafını Geliştirmek
Sanırım pek çoğumuz piyangodan veya diğer şans oyunlarından kendilerine tonlarca para çıksa ne yapac...
WCF - Visual Studio 2008 ile Gelen Yenilikler
Yazılım dünyası çeşitli ürün gruplarını ve bunların üretimini içeren materyaller içermektedir. Son k...