• Sonuç bulunamadı

5 SERVİSLER

5.7 Durum Yönetimi

Tezimin “Mesajları göndermek ve almak” başlıklı bölümünde geçen, mesajları işlemek için gereken temel kod dizilimi verildi. Mesajlar istekler için veya durumla iş alışverişi için kullanılır. Bazen servisle tümleşik olan durumu değiştirmek gerekebilir. Tezimin bu konusu altında durum yönetme yollarını anlatacağım.

5.7.1 Dâhili port’a veri nakli

Tez çalışmasının son bölümünde, servisin durumuna ulaşmak için “Get” işlemi kullanıldı. Internet tarayıcısında SOAP mesajı olarak ortaya çıkan servis durumu ana porta aktarılmıştı. Buna alternatif olarak durum bilgisi, dâhili port’a da aktarılabilir. İstek olana kadar, verilerin biriktirilmesi veya kaydedilmesi gereken durumlarda kullanışlı bir alternatiftir. Her veri, durumun özel tutuş versiyonunda depolanabilir. Duruma, servis çalıştığı sürece bakılır.

Bunun nasıl çalıştığını anlamak için, gelen her http isteği ile ilgili olan portu görüntülemekle sorumlu olan devamlı işlem servisleri dikkate alınır. Bir istek karşılandığında, bu istekle ilgili bilgi mesaj dâhili port’ta geçici olarak saklanır. Durum bilgisi, kullanıcının veya başka bir servisin izni olmadan ana port’a aktarılmaz.

Veriyi dâhili port’a aktarmak için, durum değişkenleri belirlenir. Aynı zamanda ilave port da belirlenir. Aşağıda port adı MyInternalPort olan bir portun oluşturulması için gereken kod verilmiştir.

Port<string> MyInternalPort = new Port<string>();

Daha sonra, “Update Generic” sınıfı tarafından elde edilecek bir mesaj oluşturulur. Aynı zamanda oluşturulan işlem tipi için, yeni bir işlem tipi ve servis işleyici oluşturulur. Bu yeni işlem tipi, ana PortSet tarafından desteklenen işlemler listesine eklenecektir. Örneğin GetURL adlı işlem tarafından desteklenen bir servis aşağıdaki gibi bir ana işlem portuna sahip olabilir:

[ServicePort()]

public class MonitorRequestsOperations : PortSet <DssDefaultLookup,DsspDefaultDrop, Get, GetURL> {}

Aynı zamanda, yeni bir mesaj için eşsiz bir mesaj işleyici eklemenize ihtiyaç vardır. Bu kodu http portundaki istekleri kontrol etmek için eklemelisiniz. Veriyi dâhili porta aktarmak için, CCR Arbiter sınıfından yararlanmanız gerekir. Gelen istekler ele alınırken oluşabilecek çakışmaların önüne geçmek için CCR gereklidir.

Arbiter-Recieve metodu tek öğe alıcı oluşturmak için kullanılır. Alıcı kontrolü için CCR, “DpServiceBase.Activate()” metodunu çağırmaya ihtiyaç duyar. Örneğin aşağıdaki kod, bir satırı MyInternalPort isimli port’a aktarmak için kullanılır:

MyInternalPort.Post(message);

Activate(Arbiter.Receive(true, MyInternalPort,

MyInternalPortHandler));

5.7.2 Durumu Bir Dosyaya Kaydetmek

Bazı durumlarda, servisin durumunu bir dosyaya kaydetmek faydalı olabilir. Böylece daha sonra istenildiğinde tekrar geri dönülebilir. Ayarları bir konfigürasyon dosyası olarak kaydetmek istediğinizde kullanışlı olabilir. Durum, ısrarla Initial State Partner kullanmak isteyebilir. Partner, Partner Attribute kullanılarak bildirilir. Servisler bir veya birden çok partnere sahip olabilir.

Partner, başka bir servise bağlanan bir servis sunar. Partnerlikler servisler arasındaki ilişki ile ilgili MSRS’yi bilgilendirir. ConstructorService gibi bazı partnerlikler servisinizi derlediğiniz zaman otomatik olarak oluşturulurlar.

Şekil 5.4’de System Services Web sayfasındaki Service dizininden hangi servisin hangi partnerle bağlantılı olduğunu gösterilmiştir.

 ConstructorService: Create işlemini kullanan servisler de yeni bir servisi ilişkilendirmek için kullanılır.

 PartnerListService: Partner Liste yönetici servisi geçerli partnerleri geri çağırmak için kullanılır. Bu partner tüm servisler için listelenecektir.

 DurumServisi: Durumu yönetmek gerektiğinde bu servis kullanılır. Eğer durum sadece geri çağrılan ve kaydedilmeyen bir durumsa, bu servisin partnerler listesinde bulunması gerekmez.

DSS, özel bir tip olan Initial State Partner’ı kullanıma sunar. Bu partner tipi, durum dokümanından erişilen değerleri baz alan durumun başlangıç değerini ayarlamak için kullanılır. Örneğin aşağıdaki kod, durumu MyState.Config.xml adlı bir dosyaya kaydedecek olan partneri belirlemek üzere InitialStatePartner’ı kullanır.

[InitialStatePartner(Optional = true, ServiceUri =

“MyState.Config.xml”)] private MyServiceState _state = new MyServiceState()

Bu kodda servis, MyState.Config.xml dosyasını içermese bile yine de çalışabilir. Çünkü partner isteğe bağlı bir değişkenle belirlendi. Durum dokümanı, MSRS “Installation” klasörünün altındaki “Store” dizini içinde yerleşmiştir.

Eğer durum hala içermiyorsa, “Start()” metot kodu eklenir. Bu metot, servis her çalıştırıldığında işleme alınır. Eğer durum dokümanı yoksa durum değişkenleri için başlangıç değerleri ayarlanmalıdır. Örneğin aşağıdaki “Start()” metodu, önceden oluşturulan “DssService1” için durumu sıfırlamada kullanılabilir:

protected override void Start() {

//Check to see if the state already exists. //If not, then we will initialize it

if (_state == null) {

_state = new DssService1State(); _state.Message = “”;

}

//Start the service base.Start();

Yukarıdaki örnekte tek bir durum değişkenine değinilir. Çünkü yalnızca tek bir değişken “DataMember” olarak işaretlendi. Normalde bir servis pek çok değişken içerebilir.

Durumu kaydetmek için, durumu MyService1.Config.xml dosyasına kaydeden kodu eklemek gerekir. “SaveState()” metodu DSS servis modelinin bir parçasıdır ve aşağıdaki .NET ile birlikte servis uygulamaları ile uyumludur.

using Microsoft.Dss.ServiceModel.DssServiceBase;

DspServiceBase’de servis uygulamaları için base class’ı sunan taban referansını kullanarak metotlara başvurur. Durumu kaydeden kod, durumun değerlerini değiştiren kodların bulunduğu alana eklenebilir. Böylece aşağıdaki örnekte olduğu gibi; SaveState() metodu, taban referansının içinden çağırabilir:

base.SaveState(_state);

Durum bilgisini kaydetmek, servise gelen çağrılar arasında durum bilgisine erişmek ihtiyacı doğduğunda kullanışlı olmaktadır.

Benzer Belgeler