Makale Özeti

Xml Web Servislerine giriş.

Makale

XML Web Servisleri - 2

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

Xml Web Servisleri İçin Metodlar Oluşturmak


Bir XML Web Servisi oluşturduktan sonra en önemli adım onun işlevlerini belirlemek ve bu işlevler için metodları oluşturmaktır.

Bir XML Web Servisi içindeki metodu XML Web Servisinde sunulacak hale getirebilmek için <WebMetod()> özelliği ile nitelendirilmelidir.

Bir metodu XML Web Servisinden sunulur hale getirmek için onu Public erişim denetleyicisi ile nitelendirmek yeterli değildir. Bunun yanından o metodun <WebMetod()> etiketi ile nitelendirilmesi gerekmektedir.

Bir XML Web Servisi metodunun davranışlarını belirleyebilmek için WebMetod’ un diğer özelikleri kullanılabilir.

WebMetod aşağıdaki özelliklere sahiptir.

  • BufferResponse
  • CacheDuration
  • Description
  • EnableSession
  • MessageName
  • TransactionOption

 

 BufferResponse

BufferResponse özelliği ile XML Web Servisi metodunun istemciye cevapları döndürürken izleyeceği yöntemi belirlersiniz. BufferResponse özelliği true olduğu zaman XML Web Servis altyapısı istemciye dönecek olan cevabın tümü belleklenene kadar bekler ilk byte’dan son byte’a kadar istemciye dönecek olan tüm cevap belleklene kadar bekler tüm cevap hafızaya belleklendikten sonra istemciye cevap döner. Bu özellik varsayılan olarak True değerini taşır.

Bu özelliği işlev olarak bir ASP.NET WebForm’ unda ki Response.Buffer özelliğine benzetebiliriz. Bu özellik False değerini aldığında XML Web Servisi altyapısı istemciye dönecel mesajları 16 KB’ lık parçalar olarak istemciye aktarmaya başlar. Örneğin IEnumerator arayüzünü uygulayan bir sınıfın IEnumerable.GetEnumerator metodu çağrıldığı zaman bu özellik dönecek verilerin belleklenmeden istemciye aktarılmasını sağlar.

 
CacheDuration

CacheDuration özelliği XML Web Servisinin sonuçları belleklemesini sağlar. Bu output caching olarak bilinir. XML Web Servisi altyapısı her tekil parametre için çıktısını bellekler.

Örneğin; ürünbilgilerini dönen UrunAdi(UrunNo As Integer) as String şeklindeki bir fonksiyon belleklendiği zaman gelen her UrunNo değeri için dönüş değerini ayrı ayrı bellekler. Örneğin 3 parametresi ile çağırdığımızda dönüş değeri belleklenir.

Ardından 5 parametresi ile diğer bir ürünün adını öğrenmek istediğimizde gelen parametre farklı olduğu için fonksiyonun kodu çalışır. Ve yeni bir değer döner. Ve 5 değeri için döndüğü değeri ayrı olarak bellekte saklar. Ardından tekrar 3 parametresi ile çağırdığımızda 3 parametresi için daha ön belleklenen değer istemciye döndürülür.

CacheDuration özelliğinin alacağı değer çıktının ne kadar süre bellekleneceğini saniye cinsinden belirler. Bu özelliğin varsayılan değeri 0’dır ve bellekleme işlemini kapalı duruma getirir. Bu özellik 0 (sıfır) değerini aldığında Output Caching kapanmış olur.

<WebMethod(CacheDuration:=10)> _
Public Function UrunAdi(ByVal UrunNo As Integer) As String
    Dim donecekUrunAdi As String
    veritabanına bağlan
    donecekUrunAdi değerini öğren
    Return donecekUrunAdi
End Function

Yukarıkida kod parçasında oluşturulan metod çıktısını ürettikten sonra 10 saniye bellekleyecek. 10 saniye içinde gelen isteklerde metod içindeki kodları çalıştırmadan aynı çıktıyı geri döndürecektir.

Description

Bu özellik ile XML Web Servisi altyapısı tarafından otomatik olarak oluşturulan yardım sayfasında bu metodun altında gözükecek açıklama belirlenir. Bu özellik varsayılan olarak boş string değer almaktadır.

CacheDuration özelliği için örneklediğimiz metoda ikinci bir özellik olarak Description özelliğini eklemek istersek iki özelliği virgul ile ayırmamız yeterlidir.

<WebMethod(CacheDuration:=10, Description:="Ürünün adını döner.")> _
Public Function UrunAdi(ByVal UrunNo As Integer) As String
    Dim donecekUrunAdi As String
    veritabanına bağlan
    donecekUrunAdi değerini öğren
    Return donecekUrunAdi
End Function

EnableSession

EnableSession özelliği XML Web Servisi için session durumunun açık veya kapalı olmasını belirler.

Eğer bir XML Web Servisi session özelliğini destekliyor ise, XML Web Servisi session durum bilgisine HttpContext.Curren.Session özelliği ile veya WebService.Session özelliği ile erişebilir. EnableSession özelliğinin varsayılan değeri false’dur. .

<WebMethod(EnableSession:=True)> _
Public Function ArtiBir() As Integer
    If Session("sayac") Is Nothing Then
        Session("sayac") = 1
        Return Session("sayac")
    Else
        Session("sayac") += 1
        Return Session("sayac")
    End If
End Function

Bu web metoduna istemci olmak için :

Dim srv As New localhost.Service1

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
    srv.CookieContainer = New System.Net.CookieContainer
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
    MsgBox(srv.ArtiBir)
End Sub

System.Net.CookieContainer nesnesi sayesinde istemci uygulama kendisine ilk isteğinde verilen SessionID değerini korur ve takip eden istekleri aynı SessionID ile yaptığında daha önceki isteklerinde Sessiona atadığı nesnelere erişebilir.

MessageName

MessageName özelliği XML Web Servislerinde bulunan overload metodları tekil olarak tanımlamak için kullanılırlar.

Varsayılan olarak bu özelliğin değeri metodun ismidir. Eğer bu özellik değiştirilirse SOAP mesajlarında metodun ismi değil MessageName özelliğinde tanımlanan ismi geçerli olur.

Bu özellik ile belirlenen isim sadece SOAP tanımlamasında kullanılmak içindir. İstemci tarafı yine metodları kendi isimleri ile ve overloadları ile görür.

<WebMethod(MessageName:="ikisayitopla")> _
Public Function topla(ByVal sayi1 As Integer, ByVal sayi2 As Integer) As Integer
    Return sayi1 + sayi2
End Function
<WebMethod(MessageName:="ucsayitopla")> _
Public Function topla(ByVal sayi1 As Integer, ByVal sayi2 As Integer, ByVal sayi3 As Integer) As Integer
    Return sayi1 + sayi2 + sayi3
End Function


Aşağıdaki SOAP kod bloğunda ikisayitopla olarak isimlendirilen topla metodu overload’unun SOAP istek (request) yapısı gözükmektedir.

POST /WebService2/Service1.asmx HTTP/1.1
Host: localhost
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://tempuri.org/WebService2/Service1/ikisayitopla"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ikisayitopla xmlns="http://tempuri.org/WebService2/Service1">
<sayi1>int</sayi1>
<sayi2>int</sayi2>
</ikisayitopla>
</soap:Body>
</soap:Envelope>

Görüldüğü gibi SOAP mesajında verilen mesaj ismi gözükmetedir. Fakat istemci tarafında bu uygulamaya bağlanıldığında yine topla isminde kullanılacaktır.

Overload metodlarda bu işlemin yapılması zorunludur. Çünkü SOAP üzerinden iletilen mesajlar tekil olmak zorundadır. Overload metodlar ancak bu şekilde XML Web Servisi üzerinden sunulabilmektedir.


TransactionOption

TransactionOption özelliği bir XML Web Servisi metodunun Microsoft Distributed Transaction Coordinator (MS DTC) işleminin kök nesnesi olarak katılmasını sağlar. Bu özellik System.EnterpriseServices.TransactionOption enumaration türündedir ve bu değerlerden birisini alabilir.

System.EnterpriseServices.TransactionOption enumaration’ın alabileceği değerlerin iki şekli vardır.

Bunlar :

  • Transaction işlemine dahil olmamak(Disabled,NotSupported ve Supported)
  • Yeni bir Transaction oluşturmak (Required, RequiresNew)

TransactionOption özelliğinin varsayılan değeri TransactionOption.Disabled’dır.

TransactionOption özelliği kullanılmadan önce System.EnterpriseServices.dll dosyasına reference vermek gerekir. Bu dll içinde transaction tabanlı işlemler yaparken kullanılan sınıflar vardır. System.EnterpriseServices.ContextUtil sınıfı ile transaction üzerinde SetAbort ve SetComplete metodları ile işlem yapabilmenizi sağlar.

Public Class Service1
Inherits System.Web.Services.WebService

<WebMethod(TransactionOption := TransactionOption.RequiresNew)> _
Public Function TransactionTest1() As String
transaction başarılı ise
ContextUtil.SetComplete()
Return ContextUtil.TransactionId.toString
End Function
End Class
 

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