WCF - Örnek Yönetimi

Bir dizi mesajı (istemci istekleri) hizmet örneklerine bağlamak için WCF tarafından kullanılan teknikler kümesi, Eşgörünüm Yönetimi olarak bilinir. WCF, üç tür bulut sunucusu etkinleştirmesini destekler ve bunlar bu bölümde ele alınmıştır.

Çağrı Başına Servis

Çağrı başına hizmet, WCF'nin varsayılan örnek etkinleştirme modudur. Çağrı başına hizmet için bir WCF hizmeti yapılandırıldığında, bir istemci çağrısının veya isteğinin devam ettiği zaman aralığı için bir CLR nesnesi oluşturulur. CLR, Ortak Dil Çalışma Zamanı anlamına gelir ve WCF'deki hizmet örneklerini içerir.

Çağrı başına hizmette, her müşteri talebi yeni bir tahsisli hizmet örneğine ulaşır ve bellek tüketimi, diğer örnek etkinleştirme türlerine kıyasla daha azdır.

Bir WCF hizmetinin çağrı başına hizmet olarak davranacağını belirtmek için InstanceContextMode özelliğinin InstanceContextMode.PerCall olarak ayarlanması gerekir. InstanceContextMode özelliği ServiceBehavior özniteliğine aittir. Bu nedenle, arama başına bir hizmet aşağıdaki gibi yapılandırılabilir -

[ServiceContract]
interface IMyContract
{...}
[ServiceBehavior (InstanceContextMode = InstanceContextMode.PerCall)]
class MyService : IMyContract
{...}

Bir hizmet burada IMyContract olarak ifade edilmektedir. Aşağıdaki şekil, çağrı başına servis vakası aktivasyon sürecini göstermektedir.

Çağrı Başına Servis Uygulama

[DataContract]
class Param {....}

[ServiceContract]
interface IMyContract {
   [OperationContract]
   void MyMethod(Param objectIdentifier);
}
class MyPerCallService : IMyContract, IDisposable {
   public void MyMethod(Param objectIdentifier) {
      GetState(objectIdentifier); 
      DoWork();
      SaveState(objectIdentifier);
   }
   
   void GetState(Param objectIdentifier) {....}
   void DoWork() {....}
   void SaveState(Param objectIdentifier) {....}
   public void Dispose() {....}
}

Burada Param, yukarıdaki örnek için icat edilen sözde tür parametresidir.

Oturum Başına Servis

WCF'nin bu aktivasyon modunda, bir özel veya iki varlık, yani istemci ve belirli bir hizmet örneği arasında gizli bir oturumun sürdürüldüğünü söyleyebiliriz. Özel oturum hizmeti olarak da bilinen oturum başına hizmet, her müşteri isteğine ayrılmış ve bu oturuma duyarlı hizmetle ilgili diğer tüm örneklerden bağımsız olarak kalan yeni bir hizmet örneği sunar.

Oturum başına hizmet başlatmak için, InstanceContextMode özelliğinin Oturum Başına olarak ayarlanması gerekir. Burada hizmet örneği, oturum süresi boyunca bellekte kalır.

Etkinleştirme modu ölçeklenebilirlikten muzdariptir çünkü yapılandırılmış hizmet, bu ayrılmış hizmet örneğinin her birinde yer alan maliyet nedeniyle birkaç (veya belki birkaç yüze kadar) dışında kalan ek istemcileri destekleyemez.

Oturum başına hizmet şu şekilde yapılandırılabilir:

[ServiceBehavior (InstanceContextMode = InstanceContextMode.PerSession)]
class MyService : IMyContract
{...}

Oturum başına hizmet süreci aşağıdaki şekilde gösterildiği gibi tanımlanabilir -

Aşağıdaki kod, özel bir oturumun kullanımı için yapılandırılmış bir sözleşmeyi ve hizmeti gösterir. Çıktı, istemcinin gerçekten adanmış bir hizmet örneğine sahip olduğunu gösterir.

Servis kodu

[ServiceContract(Session = true)]
interface IMyContract {
   [OperationContract]
   void MyMethod();
}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
class MyService : IMyContract, IDisposable {
   int m_Counter = 0; MyService() {Console.WriteLine("MyService.MyService()"); }
   
   public void MyMethod() {
      m_Counter++;
      Console.WriteLine("Counter = " + m_Counter);
   }
   public void Dispose() { 
      Console.WriteLine("MyService.Dispose()"); 
   }
}

Müşteri kodu

MyContractProxy proxy = new MyContractProxy(); proxy.MyMethod(); proxy.MyMethod(); 
proxy.Close();

Çıktı

MyService.MyService() Counter = 1 Counter = 2 MyService.Dispose()

Singleton Hizmeti

WCF'nin bu etkinleştirme modunda, birbirinden bağımsız tüm istemci istekleri, hizmet uç noktalarına bağlantılarına bakılmaksızın aynı iyi bilinen tek bir örneğe bağlanır. Singleton hizmeti yalnızca ana bilgisayar kapandığında atılır.

Bu hizmet, ana bilgisayar oluşturulduğunda yalnızca bir kez oluşturulur. Ana bilgisayara herhangi bir tekil örnek sağlanmadıysa, hizmet NULL olarak geri döner. Aktivasyon modu, her yöntem çağrısındaki çalışma miktarı az olduğunda ve arka planda hiçbir bekleyen işlem olmadığında en iyi durumdadır.

Bu Singleton hizmetini başlatmak için InstanceContextMode özelliğinin InstanceContextMode.Single olarak ayarlanması gerekir.

Bu nedenle, bir Singleton hizmeti şu şekilde yapılandırılabilir:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
class MySingleton : ...
{...}

Singleton hizmetinin süreci aşağıdaki şekilde gösterilmektedir -

Aşağıdaki kod, bir tekil örneği başlatmak ve barındırmak için kullanılır.

Servis kodu

[ServiceContract]
interface IMyContract {
   [OperationContract]
   void MyMethod( );
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
class MySingleton : IMyContract {
   int m_Counter = 0;
   
   public int Counter {
      get {
         return m_Counter;
      }
      set {
         m_Counter = value;
      }
   }
   public void MyMethod( ) {
      m_Counter++;
      Trace.WriteLine("Counter = " + Counter);
   }
}

Ana bilgisayar kodu

MySingleton singleton = new MySingleton( );
singleton.Counter = 42;
ServiceHost host = new ServiceHost(singleton);
host.Open( );

//Do some blocking calls then
host.Close( );

Müşteri kodu

MyContractClient proxy = new MyContractClient( );
proxy.MyMethod( );
proxy.Close( );

Çıktı

Counter = 43