Makale Özeti

SOAP protokolüyle beraber kullanılan XML Serialization tekniği sayesinde, Web Servisleri metod tanımlamalarında karmaşık veri tiplerini kullanabilmekteyiz. Örneğin tanımlanmış bir sınıfın nesnesini web servisinden geriye döndürebilir ve kullanıcı tarafında tekrardan yaratılıp kullanılmasını sağlayabiliriz. Aynı şekilde, tanımlanan sınıf tipindeki bir dizi(Array) de web metodlarından geri döndürülebilir. Peki ya geri döndürülen dizi içerisinde tanımlanan sınıfın alt sınıfları da bulunuyorsa? Bu makalemde, tanımlanmış bir sınıf ve bu sınıftan türetilmiş alt sınıflarında bulunduğu bir diziyi web metodundan nasıl geriye döndürebileceğimizi açıklayacağım.

Makale

Web Metodlarından Temel ve Türemiş Sınıfları İçeren Bir Dizinin Döndürülmesi

 

Alper ÖZEL

Bilge Adam

 

12 Kasım 2005

 

Makale Özet :

SOAP protokolüyle beraber kullanılan XML Serialization tekniği sayesinde, Web Servisleri metod tanımlamalarında karmaşık veri tiplerini kullanabilmekteyiz. Örneğin tanımlanmış bir sınıfın nesnesini web servisinden geriye döndürebilir ve kullanıcı tarafında tekrardan yaratılıp kullanılmasını sağlayabiliriz. Aynı şekilde, tanımlanan sınıf tipindeki bir dizi(Array) de web metodlarından geri döndürülebilir. Peki ya geri döndürülen dizi içerisinde tanımlanan sınıfın alt sınıfları da bulunuyorsa? Bu makalemde, tanımlanmış bir sınıf ve bu sınıftan türetilmiş alt sınıflarında bulunduğu bir diziyi web metodundan nasıl geriye döndürebileceğimizi açıklayacağım.

 

Makale İçeriği :

Temel Uygulamaların Gerçekleştirimi

Öncelikle web servisimizi yaratarak işe başlayalım.

 

Bir web servisi projesi açalım. Açılan proje içerisine bir sınıf ekleyelim. Bu sınıf web metodundan geriye döndüreceğimiz temel tipi oluşturacak.

 

public class Calisan

{

public int sicilNo;

public string ad;

public string soyad;

}

 

Görüldüğü gibi sınıfımızın adına Calisan dedik. Simdi servisimizde bu tipi geriye döndüren bir metod yaratalım.

 

[WebMethod]

public Calisan calisanDondur()

{

Calisan c = new Calisan();

 

c.sicilNo = 111;

c.ad = "Alper";

c.soyad = "ÖZEL";

return c;

}

 

Şimdilik web servisi üzerinde yapacağımız işlemleri burada bırakıp, bu servisi kullanacak bir konsol uygulaması gerçekleştirelim.

 

Konsol uygulamasında “Add Web Reference” sihirbazını kullanarak yaratmış olduğumuz web servisinin referansını ekleyelim. Eklerken ben tanımlanmış “Web Reference Name” değerini değiştirmedim. Biliyorsunuz ki bu değer yaratılacak olan proxy sınıfının namespace’i olarak atanacaktır.

 

Yaratılan Reference.cs dökümanını inceleyecek olursanız, web servisinin metodlarında kullanılan bütün tiplerin burada tanımlanmış olduğunu göreceksiniz. Alt taraftaki şekilde de görüldüğü gibi, web servisinde kullandığımız Calisan sınıfı tipi kullanıcı tarafında da tanımlanmış oldu.

 

 

 

Şekil 1: Reference.cs

 

Servisimizi kullanmak için aşağıdaki kod yeterli olacaktır.

 

static void Main(string[] args)

{

localhost.Service prx = new CN_Makale_Den.localhost.Service();

localhost.Calisan c = prx.calisanDondur();

 

Console.WriteLine(c.ad);

 

Console.ReadLine();

}

 

Buraya kadar basit bir sınıfın bir web servisi metodundan nasıl geriye döndürebilineceğini gördük. Şimdi gelelim dizilerin kullanımına.

 

Web Metodundan Bir Dizinin Geriye Döndürülmesi

Web servisimize ikinci bir metodu daha ekleyelim. Bu metod bizim için Calisan dizisini geriye döndürsün.

 

[WebMethod]

public Calisan[] calisanListesiDondur()

{

Calisan[] cList = new Calisan[2];

 

Calisan c1 = new Calisan();

c1.sicilNo = 111;

c1.ad = "Müge";

c1.soyad = "EGE";

 

Calisan c2 = new Calisan();

c2.sicilNo = 222;

c2.ad = "Yasemin";

c2.soyad = "EGE";

 

Calisan c3 = new Calisan();

c3.sicilNo = 333;

c3.ad = "Sema";

c3.soyad = "EGE";

 

cList[0] = c1;

cList[1] = c2;

cList[2] = c3;

 

return cList;

}

 

Bu metodun kullanılması için sadece web referansını güncellememiz yeterlidir ve konsol uygulamasından aşağıdaki gibi kullanılabilir.

 

static void Main(string[] args)

{

localhost.Service prx = new CN_Makale_Den.localhost.Service();

localhost.Calisan[] c = prx.calisanListesiDondur();

 

foreach (localhost.Calisan cls in c)

{

Console.WriteLine(cls.ad);

}

 

Console.ReadLine();

}

 

Web Metodundan Farklı Tipleri İçeren Bir Dizinin Geriye Döndürülmesi

Web servisi uygulamamıza geriye dönüyoruz ve bu sefer karmaşık tipte bir dizinin geriye döndürülebilmesi için gerekli olan tanımlamaları gerçekleştiriyoruz.

 

Öncelikle diziden geriye dönecek olan tipleri tanımlayalım. Calisan sınıfından türeyen iki yeni sınıf daha yaratıyorum. Bu sınıfların adlarına Mudur ve Muhendis dedim.

 

public class Mudur : Calisan

{

public string bolum;

}

 

public class Muhendis : Calisan

{

public string brans;

}

 

Bilindiği gibi polymorphism sayesinde Calisan nesnesinin referansıyla bu iki sınıfın nesnelerinin referanslarını kontrol edebilirim. Şimdi web servisinden karmaşık bir dizi geriye döndürecek metodumuzu tanımlayalım.

 

[WebMethod]

public Calisan[] karmasikCalisanListesiDondur()

{

Calisan[] cList = new Calisan[4];

Calisan c = new Calisan();

c.sicilNo = 111;

c.ad = "Alper";

c.soyad = "EGE";

 

Mudur m = new Mudur();

m.sicilNo = 222;

m.ad = "Emel";

m.soyad = "EGE";

m.bolum = "Genel Idare";

Muhendis m1 = new Muhendis();

m1.sicilNo = 333;

m1.ad = "Soner";

m1.soyad = "EGE";

m1.brans = "BI";

 

Muhendis m2 = new Muhendis();

m2.sicilNo = 444;

m2.ad = "Cenk";

m2.soyad = "EGE";

m2.brans = "AI";

 

cList[0] = c;

cList[1] = m;

cList[2] = m1;

cList[3] = m2;

return cList;

}

 

Görüldüğü gibi “karmasikCalisanListesiDondur ()“ metodundan Calisan, Mudur ve Muhendis nesnelerini içeren bir dizi geriye dönüyor. Bu metodu konsol uygulamasında kullanmaya çalışalim.

 

Eğer bir servisi kullanacaksanız, o servisin çağırımı esnasında kullanılacak bütün tiplere sahip olmanız gerekir. Yani, web servisimizde tanımladığımız metodda iki farklı veri türü daha var ve web servisinin referansını güncellediğim zaman bu iki yeni tipin yaratılması gerekiyor.

 

Web servisini güncellediğiniz zaman bu iki tip kullanıcı tarafında yaratılmayacaktır ve bu nedenle servisi kullanmak için yazdığımız aşağıdaki kod çalışma zamanında hata verecektir. Çünkü web servisi response’unda yer alan xml verisi, kullanıcı tarafında istenilen tipe dönüştürülememektedir.

 

static void Main(string[] args)

{

localhost.Service prx = new CN_Makale_Den.localhost.Service();

localhost.Calisan[] c = prx.karmasikCalisanListesiDondur();

 

foreach (localhost.Calisan cls in c)

{

Console.WriteLine(cls.ad);

}

 

Console.ReadLine();

}

 

Şimdi bu işi nasıl gerçekleştireceğimize bakalım. Bu şekildeki bir diziyi geri döndürebilmek için metodun başına çeşitli özelliklerin(attribute) aşağıdaki gibi eklenmesi gerekiyor.

 

[WebMethod]

[XmlInclude(typeof(Mudur))]

[XmlInclude(typeof(Muhendis))]

public Calisan[] karmasikCalisanListesiDondur()

{

Calisan[] cList = new Calisan[3];

...

XmlInclude özelliği(attribute) ile dizi içinde geriye dönebilecek bütün tipleri belirttikten sonra, konsol uygulamasına geriye dönüp tekrar web referansını güncelleyelim. Aşağıda görüldüğü gibi “Reference.cs” içerisinde artık Mudur ve Muhendis tiplerinin de yaratılmış durumdadır.

 

Şekil 2: Reference.cs

 

Konsol uygulamamızı tekrar çalıştırdığımızda artık istenilen cevapların alınabildiğini ve ilgili tiplerin nasıl kullanıldığını görebilirsiniz.

 

static void Main(string[] args)

{

localhost.Service prx = new CN_Makale_Den.localhost.Service();

localhost.Calisan[] c = prx.karmasikCalisanListesiDondur();

 

foreach (localhost.Calisan cls in c)

{

Console.WriteLine(cls.ad);

}

 

localhost.Mudur m = (localhost.Mudur)c[1];

Console.WriteLine(m.bolum);

 

Console.ReadLine();

}

 

Sonuç :

Bu makalede temel ve alt tipleri içeren bir dizinin web metodlarında nasıl kullanılabileceğini gördük. Aynı şekilde temel ve alt tipleri içeren bir ArrayList’in web metodundan döndürülebilmesi için de aynı özelliklerin metoda eklenmesi yeterli olacaktır.