Makale Özeti

Bu yazımızda SOAP ve detaylarını inceleyeceğiz.

Makale

Nedir SOAP ?


Merhabalar, bu yazıda SOAP’u ,yani Simple Object Access Protocol’u , yani direk türkçe çevirisiyle, Basit Nesne Ulaşım Protokolü’nü ve yani merkezi olamayan , dağınık uygulamalarda bilgi taşımaya yarayan protokolü tanıyacağız. SOAP kullanarak nesne transferi yapan, herhangi bir XML Web Servisini oluşturmadan veya çağırmadan önce, SOAP protokolünün detaylarını ve çalışma yapısını öğrenmek faydalı olacaktır.


Aslında , SOAP ve HTML in birbirlerini tamamlayan, eksiklerini kapatan iki teknoloji olduğunu söylemek gerekir. Bilindiği üzere HTML sadece “hypertext” transfer etmek amacıyla oluşturulmuş bir yapıdır, nesne transfer edemez, bu eksiği SOAP kapamaktadır.

SOAP ‘un eksikliği ise ,sadece -göndericiden alıcıya- tek yönlü veri transferi gerçekleştirebiliyor olmasıdır , ancak Web Servisleri “response/request” modeline ihtiyaç duymaktadır, dolayısıyla SOAP paketleri HTML paketlerinin içine gömülü olarak gönderilir.

SOAP dört ayrı kısımdan oluşmaktadır ;

1-SOAP Envelope : Mesajın içeriğini, mesajı kimin proses edeceğini ve bu mesajın opsiyonel yada zorunlu olup olmadığını içerir.

2-SOAP Encoding rules : Serializasyon mekanizmasını tanımlar.

3-SOAP RPC representation : Uzaktan prosedür çağırımı ve bunların geri dönüşlerini tanımlar.

4-Protocol binding : SOAP un HTTP içinde nasıl kullanılacağını tanımlar.


Ancak unutulmamalıdır ki, Encoding ve RPC detaylarını .NET Framework bizim için halletmektedir yani bizim uğraşmamıza pek gerek yoktur.


Bir SOAP mesajında root element (kök eleman), Envelope dur.Envelope zorunlu bir şekilde Body ve opsiyonel olarak Header ve Fault elementlerini içerir.


Envelope : Root

Header : Root un (Envelope) ilk alt elementi dir.Authentication (yetkilendirme), transaction management (Hareket yönetimi), payment gibi yapıların yönetimi bu blokta yapılır.

Body : Eğer header elementi yoksa body elementi envelop un yani root un ilk alt elementi olur.Web servisleri yapısında body , WS metodlarının, onların parametrelerinin ve dönüş değerlerinin konumlandırıldığı kısımdır.

Fault : Eğer Fault elementi varsa bu element Body nin içinde yer alır. Bu element hata ve statu kodunu taşımak için vardır.


Aşağıdaki elementi inceleyiniz:

 

 

HTTP/1.0 500 Internal Server Error

Content-Length: 460

Content-Type: text/xml; charset="utf-8"

 

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/”>

<soap:Body>

<soap:Fault>

<faultcode>123XYZ</faultcode>

<faultstring>Server Error</faultstring>

<detail>

<bank:faultdetails xmlns:bank="urn:OnlineBank">

<message>Your account is overdrawn</message>

<errorcode>1234</errorcode>

</bank:faultdetails>

</detail>

</soap:Fault>

</soap:Body>

</soap:Envelope>


 

 

SOAP : .NET Framework kullanarak

 

ASP.NET kullanarak bir XML Web Servisi yazdığınızda, sunucuya gidip gelen SOAP mesajlarını kontrol eden mekanizma otomatik olarak oluşturulur.

Aşağıda bir XML Web Servisi metodunu çağıran SOAP örneğini görüyorsunuz:


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

<soap:Envelope namespaces omitted for brevity>

<soap:Body>

<DocumentLiteral xmlns="http://www.contoso.com">

<address>

<Street> One Microsoft Way</Street>

<City> Redmond</City>

<Zip>98052</Zip>

</address>

<useZipPlus4>True</useZipPlus4>

</DocumentLiteral>

</soap:Body>

</soap:Envelope>


Aşağıdaki kod, yukarıda bulunan SOAP mesajını oluşturmak için kullanılır..:


public static string BuildSOAPMessage()

{

MemoryStream st;

string str;

byte [] buffer;

st = new MemoryStream(1024);

XmlTextWriter tr = new XmlTextWriter(st,Encoding.UTF8);

tr.WriteStartDocument();

tr.WriteStartElement("soap","Envelope",!

"http://schemas.xmlsoap.org/soap/envelope/");

tr.WriteAttributeString("xmlns","xsi",null,!

"http://www.w3.org/2001/XMLSchema-instance");

tr.WriteAttributeString("xmlns","xsd",null,!

"http://www.w3.org/2001/XMLSchema");

tr.WriteAttributeString("xmlns","soap",null,!

"http://schemas.xmlsoap.org/soap/envelope/");

tr.WriteStartElement("Header",!

"http://schemas.xmlsoap.org/soap/envelope/");

tr.WriteStartElement(null,"MyHeader","http://woodgrovebank.c

om");

tr.WriteElementString("Username","Pat");

tr.WriteElementString("Password","pwd");

tr.WriteEndElement();

tr.WriteEndElement();

tr.WriteStartElement("Body",!

"http://schemas.xmlsoap.org/soap/envelope/");

tr.WriteStartElement(null,"GetAccount","http://woodgrovebank

.com");

tr.WriteElementString("acctNumber","1234");

tr.WriteEndElement();

tr.WriteEndElement();

tr.WriteEndDocument();

tr.Flush();

buffer = st.GetBuffer();

Decoder d = Encoding.UTF8.GetDecoder();

char [] chars = new char[buffer.Length];

//skip the byte order mark

d.GetChars(buffer,2,buffer.Length-2,chars,0);

str = new String(chars);

tr.Close();

st.Close();

return str;

}


Hakan ULAGAN

MVP, MCT, MCSD, MCAD, MCDBA