WCF Ayarlama

Yeni geliştirdiğimiz çoğu projede WCF (Windows Communication Foundation) kullanarak geliştiriyoruz. Bu yüzden servislerin düzgün ayarlanması hem çalışmaları hem de istenilen performansı düzgün vermesi açısından son derece önemli.

Geçtiğimiz günlerde bir servisi yanlış ayarlamam yüzünden biraz sıkıntı yaşanmasına sebep oldum. Bunun için öncelikle özür dilemem gerekiyor. 😐 Sonrasında tecrübe ettiğim bir konu olduğu için yazıya dökmek istedim.

WCF service geliştirirken servise ait davranışları belirtmeniz önemlidir. Bunu yapmak için ServiceBehavior attribute’ unu kullanmanız gerekiyor. Bu davranış ayarlarında dikkat edeceğimiz iki özellik bulunuyor;

  1. ConcurrencyMode
  2. InstanceContextMode

ConcurrencyMode

Servisin hangi uyumlulukta çalışacağını belirler. Aslında daha basit söylemek gerekirse servisin gelen isteklere nasıl cevap vereceğini belirler. 3 tane seçeneği vardır. Bunlar;

  1. Single (Varsayılan)
  2. Reentrant
  3. Multiple

şeklindedir.

Single olarak seçildiğinde servis tek bir iş parçacığı ile çalışır ve tamamen isteğin bitmesini beklemektedir. Servisin senkron veya zaman uyumlu çalışması garantilenmiştir. Reentrant olarak seçildiğinde servis yine tek bir iş parçacığı üzerinde çalışır ancak, servis başka bir servisin çağrılmasına izin vermektedir. Ayrıca bir servis için callback tanımlaması yapıldıysa bu işlem başladığında yeni bir istek işlenmeye başlayabilir. En son olarak Multiple seçildiğinde servis birden fazla iş parçacığı ile çalışmaktadır.

InstanceContextMode

Bu ayar ile servisin istekleri cevaplarken kendisini nasıl kullanılır duruma getireceği ayarlanmış oluyor. Bu seçenek için de 3 tane alternatif bulunmaktadır;

  1. Single
  2. PerSession (Varsayılan)
  3. PerCall

şeklinde olan ayarların seçimine dikkat edilmesi gerekmektedir. ConcurrencyMode ile birlikte serivisi nasıl çalışacağını belirlemektedir.

Single olarak seçildiğinde servis için tek bir tane nesne oluşturulur ve servis tekrar başlatılana kadar kullanılır. Aslında tam olarak tek bir servisiniz var ve bir sürü istemciniz için sadece tek bir servis nesnesi oluşturuluyor.

Per Session seçeneğinde her bir oturum için bir nesne yaratılır, oturum bitene kadar kullanılmaya devam eder. Yani her istemci için yeni bir servis nesnesi oluşturulur. Çoğu zaman seçim olarak bu seçilebilir.

Per Call seçildiğinde her bir method çağrısı için yeni bir nesne oluşturulur ve method sonuçlandığında ise nesne yok edilir. Servisinizdeki method sayı ve istem yapacak istemci sayısının toplamı kadar (çarpımı aslında) servis nesnesi oluşturulur.

Bu ayarları ve açıklamalarını basit olarak anlattıktan sonra bunların hangi koşullarda ve hangi ayarlarda nasıl davranacağına bakalım.

InstanceContext
Mode
ConcurrencyMode
Single Multiple Reentrant
Single Bütün istemciler için tek bir iş parçacığı oluşturulur. Bütün işlem bitene kadar servis kitli kalır. Bütün istemciler için çoklu bir iş parçacağı yapısı oluşturulur. Bütün istemciler için tek bir iş parçacığı üretilir. Ancak servisin çalıştığı iş parçacığı üzerinden başka bir servis çağrısı yapılmasını izin verilir.
PerSession Her istemci için ayrı ayrı iş parçacıkları oluşturulur. Her bir istemci için çoklu bir iş parçacığı oluşturulur. Her istemci için tek bir iş parçacığı oluşturulur, ancak bu iş parçacığı çalıştığında başka bir servis çağrısına izin vermektedir.
PerCall Her istemci için ayrı ayrı iş parçacıkları oluşturulur. Her istemcinin her istediği için ayrı ve tekil bir iş parçacığı oluşturulur. Her bir method çağrısı için iş parçacığı oluşturulur. Fakat bu iş parçacığı başka bir servis methodunun çağrılmasına izin vermektedir.

Ayarların nasıl çalıştığına az çok değinmiş oldum. Ancak uygulamanızın nasıl çalışacağına ve neleri sağlamasını istediğinize göre seçiminizi daha doğru yapacaksınız. Örneğin bir bilet veya bir ürün rezervasyon sistemi için ayarların Single, Single olması istek sırasına göre işlem yapabilmenizi sağlayacaktır ya da sizin için kullanıcıların oturumları önemliyse ve çok yüksek kapasiteli işlemler yapacaksanız PerSession, Multiple olarak değiştirebilirsiniz.

Bu ayarların yanında servisleriniz için ne kadar oturum veya nesne oluşturulacağını ayarlamak mümkün. Bu işleme service throttling deniyor ve aşağıdaki şekilde bir kod parçasını servis ayarlarınıza eklemeniz yeterli oluyor.

WCF ile servis geliştirmek çok kolay olabilir ancak ayarlamayı bilmedikten sonra veya hatalı ayarladıktan sonra kullanımı tam bir işkence olabilir. Benim başıma geldi oradan biliyorum. 🙂

Yorumlayın