Makale Özeti

Xml Web Servislerine giriş.

Makale

XML Web Servisleri - 3

Konular:
• XML Web Servislerini Anlamak
• XML Web Servisleri Oluşturmak
• XML Web Servislerine İstemci Olmak
 

XML Web Servisleri ile transfer edilen veri türleri


Basit Veri Türleri

XML Web Servisleri ile basit veri türlerini web servisi üzerinden aktarabilirsiniz. Örneğin integer,string gibi türler basit veri türleridir.

ByVal ve ByRef parametreler

XML Web Servislerinde tanımladığınız parametreler ByVal (by value- değer ile) veya ByRef (by reference – referans ile) tanımalanabilir. Bu parametre tanımlama yöntemleri SOAP tarafından desteklenmektedir.

Sınıflar(Class) ve Yapılar(Structure)

Şu noktanın altını çizmek ve iyi anlamak gerekir ki, XML Web Servisleri nesnelerin uzaktan yönetilmesi gibi (object remoting) bir özellik taşımaz. XML Web Servisi için bir aracı (proxy) nesne oluşturulduğunda durum bilgisi hiç bir zaman istemciye transfer edilmez. Ayrıca XML Web Servisinin metodları her zaman sunucu tarafında çalışırlar.

Bunun sebebi HTTP protokolünün durum bilgisini saklamamasıdır. Bu durum stateless olarak tabir edilir. Buna bağlı olarak bir sınıfı parametre veya dönüş değeri olarak tanımladığınızda class yapısı hakkında çalışma yapmanız ve transfer edilmeye uygun olup olmadığından emin olmanız gerekmektedir.
 

Bir nesne XML Web Servisi ve istemci arasında hangi yöne olursa olsun transfer edilmek istendiği zaman nesne SOAP biçiminde XML olarak serialize edilir. Daha sonra transfer edilebilir.

Bu şekilde serialize edilen bir sınıf public propety ve public field’ları serialize eder. Bir sınıf yapısı içerisindeki metodlar istemci tarafına transfer edilemezler. Bu XML Web Servislerinin altyapısından kaynaklanmaktadır. XML Web Servisleri object remoting işlemi yapmak için tasarlanmamıştır.

Bir XML Web Servisi metoduna parametre olarak verilen sınıfın varsayılan olarak parametre almayan bir yapılandırıcıya (constructor) ihtiyacı vardır.

Çünkü XML Web Servisleri altyapısı XML Web Servisine gelen serialize edilmiş XML dokumanını deserialize edip yeni bir nesne oluşturabilmek için varsayılan bir yapılandırıcıya ihtiyaç duyar.

Not: Yapılandırıcı (Constructor) Visual Basic dilinde New ismindeki yordamlardır(sub).

Sınıflardan farklı olarak structure’lar her zaman varsayılan bir yapılandırıcıya sahip oldukları için özel bir çaba sarfederek kod yazılmasına gerek yoktur.

XML Web Servisi altyapısı bu varsayılan yapılandırıcıyı kullanarak bir structure parametreyi serialize ederek transfer edebilmektedir.

Diziler (Arrays)


Basi veri türlerinden, yapılardan (structure) ve sınıflardan (class) oluşan dizilerin XML Web Servisi altyapısı tarafından serialize edilmesi ve transfer edilmesi için herhangi bir özel çaba sarfetmeye gerek yoktur.

Ancak, eğer başka sınıflardan türemiş olan sınıfların dizilerini transfer etmek istediğinizde dizide olma ihtimali olan tüm sınıfları kod yazarak belirlemek gerekmektedir.

Örneğin Insan sınıfından türeyen Ogrenci sınıfı olsun. Bu ogrenci sınıfından türemiş nesnelerin bir dizisini transfer etmek istediğinizde insan sınıfınında bu dizi de yer alabilmesi ihtimali dolayısıyla özel olarak bir tanımlama yapmalısınız.
Bu tanımlamayı yapmak için XmlInclude özelliği kullanılır. Eğer türler belirlenmez ise bu dizi serialize edilirken bir hata (exception) oluşur.

Örneğin aşağıdaki kod parçasında gözüktüğü gibi bir insan sınıfı ve bundan miras alan ogretmen ve ogrenci sınıfları olsun.

Public Class insan
    Public isim As String
    Public soyisim As String
End Class

Public Class ogrenci
    Inherits insan
    Public ogrno As String
End Class

Public Class ogretmen
    Inherits insan
    Public bolum As String
    Public sicilno As String
End Class


Bu sınıflardan insan sınıfı ogretmen ve ogrenci sınıflarındaki ortak özellikleri barındırıyor. Ogretmen ve ogrenci sınıfları ise insan sınıfından miras alıp üzerine kendilerine özgü (sicilno ve ogrno gibi) özellikler ekliyorlar.

Yukarıdaki kodu Web Servisi uygulamasının içinde bir .vb uzantılı dosya veya dosyalar içerisine yazarak bu tanımlamaları Web Servisi uygulamanıza eklemiş oluyorsunuz.

 

Bunu ekledikten sonra web servisinize aşağıdaki gibi bir webmetodu ekleyin.

 

    <WebMethod(), XmlInclude(GetType(ogrenci)), _

    XmlInclude(GetType(ogretmen))> _

    Public Function OkuldakiKisiler() As insan()

        Dim liste(3) As insan

 

        Dim ogr1 As New ogrenci

        ogr1.isim = "Ahmet"

        ogr1.soyisim = "Yılmaz"

        ogr1.ogrno = "788"

 

        Dim ogr2 As New ogrenci

        ogr2.isim = "Hasan"

        ogr2.soyisim = "Doğan"

        ogr2.ogrno = "789"

 

        Dim ogret1 As New ogretmen

        ogret1.isim = "Mustafa"

        ogret1.soyisim = "Öz"

        ogret1.bolum = "Matematik"

        ogret1.sicilno = "555-221"

 

        Dim i1 As New insan

        i1.isim = "Dursun"

        i1.soyisim = "Aydın"

 

        liste(0) = ogr1

        liste(1) = ogr2

        liste(2) = ogret1

        liste(3) = i1

 

        Return liste

    End Function

 

Yukarıdaki kod parçasında OkuldakiKisiler isminde bir metod tanımlandı bu metod insan türünde bir dizi değer geriye dönüyor.

 

Bir önceki kod bloğunda yapılan tanımlara bakılırsan insan sınıfı ogretmen ve ogrenci sınıflarının temel sınıfı idi, yani bu durumda bu metod döneceği insan türünde dizi içerisinden Ogretmen ve Ogrenci turunde nesnelerde içerebilecek.

 

Bu durumda metod tanımlamasına XmlInclude özelliği ile bu dizi içerisinden yer alabilmesi söz konusu olan diğer sınıflarıda bildirmek gerekmektedir.

 

XmlInclude özelliğinin yazım kuralı aşağıdaki şekildedir. Parametre olarak Type türünde değer alır. Bir sınıfın türünü Type türünde dönebilmek için GetType metodu kullanılır.

 

XmlInclude(GetType(ogrenci)

 

Yukarıdaki tanımlanan fonksiyonun döneceği SOAP mesajı aşağıdaki şekilde olacaktır.

 

 

<?xml version="1.0" encoding="utf-8"?>

<ArrayOfInsan xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/WebService2/Service1">

  <insan xsi:type="ogrenci">

    <isim>Ahmet</isim>

    <soyisim>Yılmaz</soyisim>

    <ogrno>788</ogrno>

  </insan>

  <insan xsi:type="ogrenci">

    <isim>Hasan</isim>

    <soyisim>Doğan</soyisim>

    <ogrno>789</ogrno>

  </insan>

  <insan xsi:type="ogretmen">

    <isim>Mustafa</isim>

    <soyisim>Öz</soyisim>

    <bolum>Matematik</bolum>

    <sicilno>555-221</sicilno>

  </insan>

  <insan>

    <isim>Dursun</isim>

    <soyisim>Aydın</soyisim>

  </insan>

</ArrayOfInsan>

 

Bir XML Web Servisi metodunda dizi türünde bilgi dönebilmek için yapılması gerekli adımlar bunlardır.

 

Koleksiyonlar

 

Koleksiyonlarıda aynı nesne dizilerine yapılan işlemleri uygulayarak XML Web Servisi üzerinden transfer edebilirsiniz. Ayrıca veri dizilerinden farklı olarak hiç bir XmlInclude tanımlaması yapılmadan da çalışmaktadır. Aşağıdaki kod ArrayList dönen bir metodu göstermektedir.

 

    <WebMethod(), XmlInclude(GetType(ogrenci)), XmlInclude(GetType(ogretmen))> _

    Public Function OkuldakiKisiler2() As ArrayList

        Dim ogr1 As New ogrenci

        ogr1.isim = "Ahmet"

        ogr1.soyisim = "Yılmaz"

        ogr1.ogrno = "788"

 

        Dim ogr2 As New ogrenci

        ogr2.isim = "Hasan"

        ogr2.soyisim = "Doğan"

        ogr2.ogrno = "789"

 

        Dim ogret1 As New ogretmen

        ogret1.isim = "Mustafa"

        ogret1.soyisim = "Öz"

        ogret1.bolum = "Matematik"

        ogret1.sicilno = "555-221"

 

        Dim i1 As New insan

        i1.isim = "Dursun"

        i1.soyisim = "Aydın"

 

        Dim liste As New ArrayList

        liste.Add(ogr1)

        liste.Add(ogr2)

        liste.Add(ogret1)

        liste.Add(i1)

 

        Return liste

    End Function

 

Yukarıdaki tanımlanan fonksiyonun döneceği SOAP mesajı aşağıdaki şekilde olacaktır.

 

<?xml version="1.0" encoding="utf-8"?>

<ArrayOfAnyType xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/WebService2/Service1">

  <anyType xsi:type="ogrenci">

    <isim>Ahmet</isim>

    <soyisim>Yılmaz</soyisim>

    <ogrno>788</ogrno>

  </anyType>

  <anyType xsi:type="ogrenci">

    <isim>Hasan</isim>

    <soyisim>Doğan</soyisim>

    <ogrno>789</ogrno>

  </anyType>

  <anyType xsi:type="ogretmen">

    <isim>Mustafa</isim>

    <soyisim>Öz</soyisim>

    <bolum>Matematik</bolum>

    <sicilno>555-221</sicilno>

  </anyType>

  <anyType xsi:type="insan">

    <isim>Dursun</isim>

    <soyisim>Aydın</soyisim>

  </anyType>

</ArrayOfAnyType>

 

 

DataSet’ler

 

DataSet’ ler Xml Web Servisleri ile transfer edilebilmek için çok uygun bir yapıya sahiptir. Bir DataSet’i transfer etmek için özel bir çaba sarfetmek gerekmemektedir.

 

Typed DataSet veya untyped DataSet’ler arasındaki temel fark typed DataSet’ lerin DataSet içindeki tablolarda yer alan tablo alanları için birer property içermesidir. Typed DataSet’ ler DataSet sınıfını miras alan ve onu genişleten sınıflardır. Typed DataSet’lerde her sütun için yer alan propertyler sayesinden Typed DataSet’ ler uygulama geliştiricilere kolaylıklar sağlar.

 

Untyped DataSet’ ler herhangi bir şema bilgisi içermezler. İçerisindeki sutünlar ve tablolara erişim için propertyler bulunmaz. Bu yüzden geliştirme aşamasında dikkat ister. Typed DataSet’lerden farklı olarak yanlış bit sutün veya tablo ismine erişmek gibi yapılacak bir hata ancak çalışma zamanında anlaşılır.

 

DataSet’ler typed olsun yada untyped olsun XML Web Servislerinden transfer edilmek için herhangi bir çaba sarf etmeden transfer edilebilirler. Bu DataSet’in verileri zaten XML dokumanları olarak saklamasından dolayı kolayca olmaktadır.

 

Cengiz HAN
Microsoft ASP.NET MVP
msn (ve email) : cengiz@cengizhan.com
(eğer online isem çekinmeden mesaj atabilirsiniz.)
e-mail : cengizh@yazgelistir.com