Makale Özeti

Xml Web Servislerine giriş.

Makale

XML Web Servisleri - 1

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

XML Web Servislerini Anlamak

Xml Web Servisleri yazılan program kodunu çalıştıran bileşenlerdir. Sıradan bileşenlerden farkı bu işlevi farklı bilgisayarlara da sunmasıdır. XML Web Servislerine farklı bir bilgisayar ve farklı bir platformdan istemci olunabilir.

Yani XML Web Servisleri farklı platformalar arasında ortak olarak kullılanbilen bileşenlerdir. XML Web Servisleri ile farklı platformlar arasında veri aktarımada belli standartlar sayesinden oldukça kolaylaşmaktadır.

XML Web Servisleri standart olan protokoller üzerinde çalışır. Bunlar, HTTP, XML, SOAP standartlardır. XML Web Servisleri adından da anlaşıldığı gibi mesaj alış verişi için XML standardını kullanır.

XML’ in bir standart olması ve herhangi bir platforma bağlı olmaması sayesinde XML Web Servisleri farklı platformların konuşmasını, veri alış verişini sağlar. Bu sayede uygulam geliştirme aşamasında programcılar farklı sistemleri kullanan uygulamalar yazarken standartları kullanarak işlerini daha kolay bir şekilde yapabilirler.

XML Web Servisleri HTTP protokolü üzerinden mesaj alış verişin yaptığı için internet üzerinden bir XML Web Servisine erişim yapılabilmektedir. Ek olarak bir intranetde de XML Web Servisi uygulamasu yapılabilir. Önemli olan XML Web Servisinin HTTP protokolü ile yani bir web sunucusu ile sunuluyor olmasıdır. Tabiki .NET Framework üzerinde programlanmış olan bir XML Web Servisinin sunulabilmesi için Internet Information Services (IIS) ve .NET Framework gerekmektedir.
 

XML Web Servislerinin Alt Yapısı
 

XML Web Servislerinin sağladığı faydalardan birisi XML Web Servisine istemci olacak ve o servisi kullanacak olan uygulamanın o servisin sadece adresini bilmesi yeterlidir. Bu şekilde servise eriştikten sonra XML Web Servisinin metodları çalıştırılabilir.

XML Web Servisleri Dizinleri

Yayında bulunan ve kaydedilmiş servisleri listeleyen merkezi noktalar, dizinler vardır. Bu dizinler sayesinde arama yapıp istediğiniz bir XML Web Servisine ulaşabilirsiniz. Bu dizinlerin XML Web Servislerini listelemesini belirleyen tanımalamalara Universal Description, Discovery and Integration (UDDI) denir.
Çeşitli XML Web Servisleri dizinleri mevcuttur. Bunlardan bir tanesi Microsoft’un XML Web Servisi dizini olan, http://uddi.microsoft.com sitesidir. Bu dizinlerde istediğiniz şekilde XML Web Servisi araması yapabileceğiniz gibi XML Web Servislerinizide bu dizinlere kaydedebilirsiniz.

XML Web Servisleri Bulunması

Bu işlem ile istemciler XML Web Servislerini tanımlayan (WSDL) dokümanların konumlarını alırlar.
Bu adım ile istemciler XML Web Servislerinin konumları ile ilgili bilgi sahibi olurlar.

XML Web Servisleri Tanımlaması

Xml Web Servisi Tanımlaması XML Web Servisinin biçimi hakkında bilgileri içeren bir XML dokümanıdır. Bu doküman ile XML Web Servisi üzerinde yapılabilecek olan işlemler istemciye bildirilir.
 

XML Web Servisinin İşleyişi

1. Eğer kullanılacak XML Web Servisinin adresi bilinmiyorsa bir UDDI dizini yardımı ile bir XML Web Servisi bulunur.

2. Discovery dosyasına (.disco) yapılan istek ile web servisinin tanımalama dosyasına yönlenilir.

3. Web Servisinin açıklama dosyası olan WSDL dosyasına istek yapılır. Servis biçimi öğrenilir.

4. Artık XML Web Servisinin metodları çalıştırılmaya hazır olarak istemcinin hizmetindedir. XML Web Servisinin metodları çalıştırılır.

Bir istemci UDDI aracılığı ile bir XML Web Servisine eriştiğinde UDDI servisi istemciye XML Web Servisinin discovery dosyası olan .disco uzantılı dosyanın adresini döner. Bu .disco dosyası XML Web Servisini tanımlayan kaynaklara link içerir.

<?xml version="1.0" ?>
<disco:discovery
xmlns:disco="http://schemas.xmlsoap.org/disco"
xmlns:wsdl="http://schemas.xmlsoap.org/disco/wsdl">
<wsdl:contractRef
ref="http://www.siteniz.com/Hesapci.asmx?WSDL"/>
</disco:discovery>


İstemci .disco dokümanındaki bilgileri kullanarak sunucudan XML Web Servisi açıklama dosyasına istek yapar. Bu dosya WSDL dosyasıdır. WSDL (Web Services Description Language) XML tabanlı bir dosyadır ve istemcinin XML Wev Servisinin işlevlerini öğrenip etkileşime geçebilmesini sağlar.

Bir istemci XML Web Servisinin metodlarını çalıştırması için gerekli olan işlemler şunlardır.

1. İstemci yazılım istemci tarafında kalmak üzere bir sınıf yapısı oluşturur. Bu sınıf XML Web Servisinin WSDL dosyasında tanımlanan yapısına uygundur. Yani XML Web Servisinde hizmete açılan sınıfın yapısı ile aynı yapıdadır. Buna aracı (proxy) nesne denir.

2. İstemci sunucu sınıfın bir metodunu çağırır.

3. İstemcideki XML Web Servisi altyapısı metod çağrısını ve metodun parametrelerini SOAP mesajı olarak serialize eder. Ve bu mesajı XML Web Servisine yönlendirir.

4. Sunucudaki XML Web Servisi altyapısı gelen SOAP mesajını deserialize eder, nesnenin sunucu üzerinde bir örneğini oluşturur ve çağrı yapılan metoda parametreleri ile beraber çağrı yapar.

5. XML Web Servisi metodu çalıştırı ve geriye dönen değerleri altyapıya döndürür.

6. XML Web Servisi altyapısı dönecek değeri SOAP mesajı olarak serialize eder ve bu mesajı ağ üzerinden istemciye gönderir.

7. İstemci bilgisayardaki altyapı gelen SOAP mesajını deserialize eder ve değerleri aracı (proxy) nesneye aktarır.

8. Aracı (proxy) nesne ise aldığı değerleri kendi istemcisine aktarır.


Bir XML Web Servisi oluşturabilmek için .NET Framework’ün bir bileşeni olan ASP.NET altyapısı kullanılır.

XML Web Servisleri Oluşturmak

XML Web Servisi oluşturmak bir bileşen oluşturmaktan farklı değildir. XML Web Servisleri ağ ortamının avantajı ağ ortamı üzerinden paylaşılabilir olmasıdır.

Visual Studio.NET ile Yeni Bir Web Servisi oluşturmak için:

1. File>New Project menü seçeneğine tıklayın.
2. Açılan New Project penceresinden uygulama geliştirmek istediğiniz dili seçtikten sonra ASP.NET Web Service seçeneğini seçerek OK butonuna basın.
3. Açılan projede .asmx uzantılı dosyalar web servisi uygulama dosyalarıdır.
 

Web Servis Projesinde Yer alan dosyalar

AssemblyInfo.vb : Bir assembly’nin versiyon bilgisi gibi bilgilerini düzenlemek için kullanılan dosyadır. Tüm .NET projelerinde yer alan bir dosyadır.

Global.asax ve Global.asax.vb : Global.asax ve onun codebehind dosyası olan Global.asax.vb dosyası ile uygulama ve oturum bazında olay yönetimi yapılabilir. Bu dosya uygulamanın ana klasöründe yer almalıdır.

Service1.asmx ve Service1.asmx.vb : Bu iki dosya Service1.asmx ve codebehind dosyası olan Service1.asmx.vb dosyaları bir Web Servisini oluştururlar. Service1.asmx’in görevi IIS tarafında Web Servisinin bulunabilmesini sağlamak ve Web Servisi için giriş noktası olmaktır.

Service1.asmx.vb dosyası yazılan program kodlarını içeren dosyadır. ASP.NET uygulamalarında olduğu gibi uygulama derlenince sonra oluşan .dll dosyasında bu kodlar yer alır.

Service1.asmx.vb dosyasının içeriği

Public Class Service1
Inherits System.Web.Services.WebService
methodlar
methodlar
End Class


Web Servislerinin codebehind dosyaları System.Web.Services.WebService sınıfından miras alırlar.

Web Servisi içerisindeki metodun intenet üzerinden sunulabilmesi <WebMethod()> özelliği ile nitelendirilmesi gerekmektedir.


<WebMethod()> Public Function HelloWorld() As String
    Return "Hello World"
End Function

Yukarıdaki kod bloğunda yazılan HelloWorld ismindeki fonksiyon web servisi üzerinden hizmete açılmış bir function tanımlamasıdır. Bu fonksiyonun web servisinden sunulmasını sağlayan ifade <WebMetod()> ifadesidir.

Yeni Proje Açtığınız da oluşturulan Web Servisi dosyasının içeriği şu şekildedir.


Bu şekilde bir WebServisi tanımlamasını yapıp web üzerinden XML Web Servisi olarak sunulan bileşeninizi yaptığınızda aynı bilgisayar üzerinden servise http://localhost/webservice1/service1.asmx şeklinde erişim yaptığınız zaman XML Web Servis alt yapısı bir yardım sayfası sunacak ve servis üzerindeki metodları bu arabirim sayesinde listeleyip, test etmenizi sağlayacaktır. Bu sadece aynı bilgisayar üzerinden erişimlerde çalışır.

Ayrıca açılan bu yardım sayfasında Web Servisindeki metodların bilgilerini sunan SOAP biçiminde XML tanımalamalarıda gözükmektedir.
 

Servis Açıklama Sayfası

Bir XML Web Servisi için yapılan servis açıklamasına Web Services Description Language (WSDL) denir. Servis yardım sayfasında “Service Description” isminde bir link gözükmektedir. Bu link servisinde WSDL açıklamalarına link vermektedir. Bu linkin yolu aşağıdaki şekildedir.

http://sunucuadresi/servisdizini/service.asmx?WSDL gerçek bir örneğine bakarsak localhost üzerindeki WebService2 içindeki Service1.asm servisi için link şu şekilde olmalıdır. http://localhost/WebService2/Service1.asmx?WSDL

Bu adrese erişebilmek için yardım sayfasındaki linki kullanmak zorunlu değildir. Bu adresi web tarayıcısının adres kısmına yazıp, sayfaya istek yaptığınız zaman aynı WSDL tanımalamasını görebilirsiniz. Tabiki adresinde sonuna ?WSDL querystring ifadesini eklemeniz gerekmektedir.

Yeni oluşturulmuş ve içinde sadece HelloWorld isminde metodumuz olan bir XML Web Servisi için WSDL XML dokümanı şu şekilde olacaktır.

<?xml version="1.0" encoding="utf-8"?>
<definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:s0="http://tempuri.org/WebService2/Service1" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" targetNamespace="http://tempuri.org/WebService2/Service1" xmlns="http://schemas.xmlsoap.org/wsdl/">
  <types>
    <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/WebService2/Service1">
      <s:element name="HelloWorld">
        <s:complexType />
      </s:element>
      <s:element name="HelloWorldResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="HelloWorldResult" type="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
    </s:schema>
  </types>
  <message name="HelloWorldSoapIn">
    <part name="parameters" element="s0:HelloWorld" />
  </message>
  <message name="HelloWorldSoapOut">
    <part name="parameters" element="s0:HelloWorldResponse" />
  </message>
  <portType name="Service1Soap">
    <operation name="HelloWorld">
      <input message="s0:HelloWorldSoapIn" />
      <output message="s0:HelloWorldSoapOut" />
    </operation>
  </portType>
  <binding name="Service1Soap" type="s0:Service1Soap">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />
    <operation name="HelloWorld">
      <soap:operation soapAction="http://tempuri.org/WebService2/Service1/HelloWorld" style="document" />
      <input>
        <soap:body use="literal" />
      </input>
      <output>
        <soap:body use="literal" />
      </output>
    </operation>
  </binding>
  <service name="Service1">
    <port name="Service1Soap" binding="s0:Service1Soap">
      <soap:address location="http://localhost/WebService2/Service1.asmx" />
    </port>
  </service>
</definitions>
 


Bu dosyanın SOAP biçiminde düzenlenmiş bir XML dosyasıdır. XML Web Servisine daha sonra bir istemci olarak bağlanmak istediğinizde XML Web Servisi istemci altyapısı bu dosyadaki tanımlamalara bakarak bir aracı (proxy) sınıf oluşturacak ve istemci tarafından bu XML Web Servisine erişilebilmesini sağlayacaktır.

Bu aracı sınıfın oluşturulması işlemi Visual Studio.NET arabirimi ile referans verildiğinde yapılacaktır.

Fakat Visual Studio.NET kullanmadan bir XML Web Servisine istemci olmak istiyorsanız.NET Framework’ün bir parçası olan WSDL.exe komut satırı uygulamasını kullanabilirsiniz.
 

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