Makale Özeti

SQL Server 2000 yayınlandıktan sonra Microsoft SQLXML adlı ürünü yayınlayarak SQL Server 2000'in XML desteğini güncelledi ve geliştirdi. SQLXML 3.0 sürümü SQL Server 2005'teki web servisi desteğine benzer şekilde, stored procedure ve user-defined function'lara HTTP protokolü üzerinden web servisi metodları şeklinde erişilmesini sağlayan SOAP web services desteğini sunuyordu.

Makale

SQL Server 2000 yayınlandıktan sonra Microsoft SQLXML adlı ürünü yayınlayarak SQL Server 2000'in XML desteğini güncelledi ve geliştirdi. SQLXML 3.0 sürümü SQL Server 2005'teki web servisi desteğine benzer şekilde, stored procedure ve user-defined function'lara HTTP protokolü üzerinden web servisi metodları şeklinde erişilmesini sağlayan SOAP web services desteğini sunuyordu.

SQLXML web servisi desteğini IIS altında çalışan bir Internet Services API (ISAPI) dll'i aracılığıyla sağlıyordu. SQL Server 2005 stored procedure ve fonksiyonların web servisi olarak sunulmasını native olarak desteklemektedir. Bu IIS ve SQLXML'den bağımsız olarak stored procedure ve fonksiyonlarımızı web servisi metodları olarak yayınlayabileceğimiz anlamına geliyor. Bu makalede SQL Server 2005 ile gelen native HTTP SOAP desteğini ele alıyor olacağız ancak önce SOAP, web servisleri ve WSDL konularına kısaca değineceğiz.

 Unutmamalıyız ki native HTTP SOAP desteği, SQLXML'in yerini tamamen alacak bir özellik değildir. SQLXML URL sorguları, template'ler, updategram'ler ve bulk loading gibi pek çok özellik sunmaktadır.

Kısaca SOAP, Web Servisleri ve WSDL
XML Web Servisleri HTTP, SOAP ve XML'e dayanan ve x bir platformdaki x uygulamanın, bir başka uygulamada (ve genellikle tamamen ayrı bir platformda) yer alan metoda Internet üzerinden erişmesini sağlayan bir teknolojidir.

Web Servislerinin en sık kullanıldığı alan, Internet üzerinden uygulamaların entegrasyonudur. İstemci uygulama HTTP üzerinden web servisinin çalıştığı web sunucusuna SOAP Request envelope adında bir XML paketi gönderir. Sunucu tarafında web servis metodu çalıştırılır ve istemci tarafından alınarak metodun çalıştırılması sonucunda oluşan sonuçları görmek için parse edilecek SOAP Response Envelope olarak adlandırılan ayrı bir XML paketi gönderir. Bir hata ile karşılaşılması halinde web servisi SOAP hata mesajı dönecektir.

Web servisleri platform ve dilden bağımsız yapılardır. Bu istediğiniz herhangi bir programlama dili ile web servisi oluşturabileceğiniz, istediğiniz platformda yayınlayabileceğiniz ve istediğiniz platformdan, istediğiniz programlama dilini kullanarak web metodlarını çağırabileceğiniz anlamına geliyor. Tabi bu söylediklerim istemcinin SOAP talep XML metni oluşturabildiği, sunucunun gönderilen XML verisini XML formatında SOAP Response olarak yanıtlayabildiği ve Client'ın sunucudan gelen XML verisini işleyebildiği durumlarda geçerli olacaktır.

Web Servislerinin Temel Yapı Taşları
XML Web Servislerinde dört temel yapı taşı vardır. Bunlar: XML, SOAP, HTTP ve WSDL'dir.

XML uygulamaların bir arada çalışabilmesi ve farklı platformların entegrasyonu için en temel bileşendir. Esnekliği, genişletilebilirliği ve uyumluluğu, XML'i Internet üzerinden mesaj gönderip alma konusunda mükemmel bir alternatif haline getiriyor. Web Servisleri marshaling formatı olarak XML'i kullanmaktadır.

SOAP standartı ise W3C tarafından geliştirilmiş, web servisleri tarafından gönderilecek mesajların yapısını belirleyen bir standarttır. SOAP başlangıçta, Simple Object access Protocol isminin kısaltması olarak kullanılmış olsa da, artık kısaltma olarak değil, standardın ismi olarak kullanılmaktadır. SOAP talep ve cevap paketlerini tanımlamak için XML sözdizimini kullanır. Bir diğer deyişle, SOAP spesifikasyonu, talep ve cevap XML verilerinin yapısının nasıl olacağını, web servisinin hataları nasıl bildireceğini, çeşitli ek bilgilerin SOAP header aracılığıyla nasıl gönderileceğini ve bunlar gibi kuralları belirler. Web servislerinin talep ve cevap yapılarının standartlaştırılması web servislerini farklı üreticilere ait programlama dilleri ile geliştirip, farklı üreticilerin geliştirdiği platformlardan erişebilmemizi sağlar.

Aşağıda bir SOAP request envelope'ın yapısını görebilirsiniz.

POST /StockQuote HTTP/1.1
Host: www.mylovely2bsite.com
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn
SOAPAction: "Some-URI"

<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<m:GetLastTradePrice xmlns:m="Some-URI">
<symbol>DIS</symbol>
</m:GetLastTradePrice>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>


Aşağıdaki ise SOAP response envelope'ın yapısıdır.

HTTP/1.1 200 OK
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn

<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
<SOAP-ENV:Body>
<m:GetLastTradePriceResponse xmlns:m="Some-URI">
<Price>34.5</Price>
</m:GetLastTradePriceResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

SOAP request ve response'u herhangi bir protokol (HTTP, SMTP, v.b.) kullanılarak gönderilebilir. Bunu doğum günü etkinliklerim nedeniyle bana göndereceğiniz hediyeyi UPS, DHL, Yurtiçi Kargo veya istediğiniz başka bir kargo firması ile gönderebilecek olmanıza benzetebiliriz. Günümüzde web servislerinde en sık kullanılan protokol HTTP'dir. HTTP aynı zamanda SQL Server 2005'in web servis özelliğinin desteklediği tek protokoldür. SQL Server 2005 Native Web Services desteği sadece Windows Server 2003 ve Windows XP SP2>'de mevcuttur. Bu sadece bu iki işletim sisteminin kernel'inin SQL Server 2005'in IIS'e gereksinim duymadan HTTP SOAP desteği vermek için kullanacağı http ile ilgili bölümleri içermesinden kaynaklanmaktadır. Http ile ilgili bölümlerin (http.sys) kernel'de bulunması, HTTP taleplerinin çok daha hızlı işlenmesini sağlamaktadır. Bu nedenle SQL Server 2005 native HTTP SOAP desteği, ISAPI ve IIS tabanlı SQLXML'e göre çok daha yüksek performansla çalışmaktadır. SQL Server 2005 HTTP SOAP desteği öncesinde SQL Server'a erişmekte kullanılabilecek tek protokol Tabular Data Stream (TDS)'ti. HTTP SOAP desteği aynı zamanda SQL Server'a erişmek için HTTP protokolünü alternatif bir protokol haline getiriyor ve SQL Server'a tüm platformlardan SQL Server network library bileşenlerinin kurulumunu gerektirmeden erişilebilmesini sağlıyor. Örneğin SQL Server 2005'e artık bir Unix bilgisayarda çalışan bir perl istemcisinden veya Pocket PC veya SmartPhone üzerinde çalışan C++ veya .NET ile yazılmış bir uygulamadan da MDAC gibi herhangi bir client bileşenine gereksinim duymadan erişebiliyoruz.

Bu Microsoft tarafından ilişkisel veritabanı yönetim sistemleri arasında ürün yaygınlaştırma açısından ve bilgiye her an her yerden ve her cihazdan erişebilme vizyonu doğrultusunda atılmış en önemli adımlardan biridir.

Yapıtaşlarından dördüncü ve sonuncusu Web Services Description Language (WSDL)'tır. WSDL, SOAP ve XML gibi W3C tarafından geliştirilmiş (http://www.w3.org/TR/wsdl) bir spesifikasyondur. WSDL, bir web servisi tarafından sunulan tüm arayüzleri açıklayan XML tabanlı bir formattır. WSDL web servisi tarafından gönderilebilecek ve alınabilecek mesajları ve işlemleri tanımlar. Bir WSDL dokumanı web servisi kullanıcısı ve sunucusu arasında bir sözleşme gibi görülebilir. WSDL dokumanı web servisinin sunduğu özellikleri, nasıl iletişim kurduğunu ve servisin nerede bulunduğunu tanımlar. Özetlemek gerekirse WSDL, bir istemcinin, web servisi ile iletişim kurabilmesi için gerekli bilgileri içerir. SQL Server 2005 WSDL dokumanını otomatik olarak üretebilmektedir ancak gerekli olması halinde WSDL dokumanını oluşturacak bir stored procedure de oşuşturabilir veya web servisleri için Native HTTP SOAP desteği tarafından WSDL dokumanı oluşturulmasını disable edebilirsiniz.

HTTP Endpoint'lerin Oluşturulması
SQL Server'ın SOAP talepleri için HTTP protokolünü dinlemesini sağlamak için ilk adım CREATE ENDPOINT t-sql ifadesini kullanarak bir HTTP Endpoint oluşturmaktır. CREATE ENDPOINT ifadesi yeni bir web servisi oluşturmanızı ve opsiyonel olarak endpoint'in sunacağı metodları tanımlamanızı sağlar. ALTER ENDPOINT ifadesi ile web servisinin seçeneklerini değiştirebilir, web metodları ekleyebilir, mevcut olanları kaldırabilirsiniz.

Bir HTTP Endpoint oluşturduğunuz zaman, SQL Server'ın SOAP taleplerini dinleyeceği port numarasını da içeren unique bir URL belirtmeniz gerekir. Bu URL'e talep geldiği zaman, http.sys kernel HTTP modülü gelen mesajı URL ile ilişkilendirilmiş SQL Server endpoint'ine yönlendirir. Daha sonra SQL Server ilgili stored procedure veya fonksiyonu çalıştırır, oluşan sonucu XML'e dönüştürür ve yanıtı SOAP response envelope olarak gönderir.

CREATE ENDPOINT, HTTP SOAP endpoint, T-SQL taleplerini dinleyecek TCP tabanlı bir endpoint oluşturmak veya service broker veya database mirroring fonksiyonları için bir endpoint oluşturmakta kullanılır. Bu ifadede, oluşturulacak endpointin ismini, authorization detaylarını ve oluşturulacak endpointin türüne göre gerekli bazı ek bilgileri belirtmemiz gerekir.

CREATE ENDPOINT ifadesi bir kullanıcı transaction'ı kapsamında çalıştırılamaz. Bu nedenle BEGIN TRANSACTION ifadesi ile bir transaction başlattıktan sonra CREATE ENDPOINT ifadesini çalıştırabilmek için transaction'ı commit veya rollback yapmanız gerekmektedir.

Aşağıda CREATE ENDPOINT ifadesi ile aşağıdaki stored procedure'u bir web metodu olarak yayınlayacak bir HTTP SOAP Web Servisi oluşturacak bir örnek yer alıyor.

Örnek tablomuzda, firmanın http://www.tcmb.gov.tr/kurlar/today.xml adresindeki verilere dayanarak ürünlerinin satışında uyguladığı anlık döviz kurları yer alıyor.

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
USE yazgelistir;
GO
IF OBJECT_ID('dbo.BizimKurlar') IS NOT NULL
DROP PROCEDURE dbo.BizimKurlar;
GO
CREATE PROCEDURE dbo.BizimKurlar
AS
BEGIN
SELECT * from dovizKurlari;
END;



Şimdi CREATE ENDPOINT ifadesini kullanarak yukarıdaki stored procedure'ı HTTP üzerinden çalıştırılabilecek bir web servis metodu olarak yayınlayalım.

IF EXISTS (SELECT endpoint_id FROM sys.endpoints WHERE name = 'eKurlar')
DROP ENDPOINT eKurlar;
GO

CREATE ENDPOINT eKurlar
STATE = STARTED
AS HTTP
( AUTHENTICATION = (INTEGRATED),
PATH = '/SQLWebSvcs/AW',
PORTS = (CLEAR)
)
FOR SOAP
( WEBMETHOD 'BizimKurlar'
( NAME = 'yazgelistir.dbo.BizimKurlar'),
WSDL = DEFAULT,
DATABASE = 'yazgelistir'
);
GO

Bu batch önce sys.endpoints view'ını kullanarak eKurlar adında bir endpoint olup olmadığını denetliyor, eğer varsa DROP ENDPOINT DDL ifadesini kullanarak endpointi siliyor. Sonrasında CREATE ENDPOINT ifadesini kullanarak HTTP endpointi oluşturuyor.

Bu noktada kısa bir ipucu vermekte fayda var. Yukarıdaki T-SQL ifadesini üzerinde IIS çalışan bir Windows XP SP2 işletim sisteminde çalıştırırken 0x80070020 kodlu hatayı alıyorsanız ve CREATE ENDPOINT ifadesi başarısız oluyorsa, IIS'i durdurarak T-SQL ifadesini yeniden çalıştırabilir veya HTTP SOAP endpoint için farklı bir port belirtebilirsiniz. 80 numaralı portta bir HTTP SOAP endpointe sahipsenizve eğer IIS'in native XML Web Services Support özelliği aynı portu dinliyorsa ve IIS'i çalıştıramıyorsanız, HTTP SOAP endpointinizi drop etmeli veya kullandığı port numarasını değiştirmelisiniz. Windows Server 2003 sürümlerinde IIS http.sys alt sistemine dayanan bir mimariye sahip olduğu için bu tarz bir sorunla karşılaşmıyoruz.

Şu andan itibaren web servisimiz http://localhost/SQLWebSvcs/eKurlar adresinden erişilebilir durumdadır. HTTP SOAP endpointi yukarıdaki ifade ile oluşturduktan sonra http://localhost/SQLWebSvcs/AW?wsdl yazarak web servisi için oluşturulan WSDL dokumanına erişebiliriz. Şu anda bu dokuman sadece BizimKurlar adlı metodumuzu içermektedir. Bu web servisini kullanabilmek için Visual Studio'dan http://localhost/SQLWebSvcs/AW?wsdl adresini kullanarak projenize bir web referansı ekleyebilirsiniz. Örnek projeleri:
     Visual Basic.NET 2005: http://www.sumerkent.com/downloads/SQL2k5NativeXMLWSSupportSampleVB.zip
     Visual C# 2005: http://www.sumerkent.com/downloads/SQL2k5NativeXMLWSSupportSampleCS.zip
adreslerinden download edebilirsiniz.

HTTP SOAP Endpointlerin Yönetimi
"Secure by Default" kuralından yola çıkarak SQL Server 2005 standart kurulumla birlikte herhangi bir HTTP SOAP endpoint bulundurmamaktadır. SQL Server üzerinde CREATE ENDPOINT yetkisine sahip ve sysadmin rolüne dahil kullanıcılar HTTP SOAP endpoint oluşturabilmektedirler. Endpointler varsayılan olarak durdurulmuş durumdadır. CREATE ENDPOINT ifadesinde veya ALTER ENDPOINT ifadesinde STATE = START ifadesi kullanılarak HTTP SOAP erişimi aktif hale getirilebilir.

SQL Server 2005 aynı zamanda SSL (Secure Sockets Layer) desteği sunmaktadır.

Endpointe erişimi kontrol etmek için AUTHENTICATION özelliği BASIC, DIGEST, INTEGRATED, NTLM veya KERBEROS değerlerini alabilir.

BASIC authentication modu SSL gerektirmektedir ve Base64 ile encode edilmiş virgül ile ayrılmış kullanıcı adı ve parola bilgilerini kapsayan bir authentication header içermektedir.

DIGEST authentication modunda talep sunucuya gönderilmeden önce kullanıcı adı ve parola MD5 ile şifrelenir. Sunucunun hem parolaya hem de MD5 hashine erişimi olduğu için doğrulama yapmak amacıyla istemci tarafından sağlanan verileri karşılaştırma imkanı vardır. Bu sayede istemci sunucuya, gerçek parolayı vermeden, gerçek parolayı bildiğini ispat edebilmektedir.

INTEGRATED authentication modunda sunucu önce Kerberos ile kimlik doğrulama yapmaya çalışır. İstemcinin Kerberos'u desteklemiyor olması veya negotiation'ın mümkün olmaması durumunda authentication NTLM'e döner. NTLM, Windows 95, Windows 98 ve Windows NT 4.0 tarafından desteklenen bir authentication metodudur. Bu authentication mekanizmasında basic ve digest'e göre daha güvenli ve aşılması zor bir yapıya sahiptir. NTLM Windows 2000 ve sonraki sürümlerde bir Security Support Provider Interface (SSPI) ile sunulmaktadır. Kerberos authentication mekanizması Internet için standart bir mekanizmadır. Kerberos authentication mekanizması Windows 2000 ve sonraki sürümlerde bir SSPI ile desteklenmektedir. Kullanıcının kimliği doğrulandıktan sonra kullanıcı CREATE ENDPOINT ifadesinde yer alacak DATABASE özelliği ile spesifik bir veritabanına yönlendirilebilir.

Endpointler sunucu seviyesinde güvenlik işlemlerine tabidir. Endpointin sysadmin rolündeki ownerı, ALTER, EXECUTE, CONNECT, TAKE OWNERSHIP ve VIEW DEFINITION endpoint yetkileri için GRANT, DENY veya REVOKE ifadelerini kullanarak işlem yapabilir.

Aşağıdaki tablo HTTP SOAP metadatasını görüntülemek için kullanabileceğiniz catalog view'larını listelemektedir.

 

HTTP SOAP Catalog View'ları

sys.endpoints Bu tablo her endpoint için bir satır içermektedir. protocol ve protocol_desc sütunları endpointin türünü (TCP, VIA, HTTP, vs.) belirtmekte, state sütunu ise endpointin durumunu (started, stopped, disabled) belirtmektedir. principal_id sütunu ise endpointin sahibini tanımlamaktadır.
sys.httpd_endpoints Bu liste HTTP kullanan endpointleri içermektedir. site, URL, port, authentication metodu ve sıkıştırma özelliğini belirten sütunlar mevcuttur.
sys.soap_endpoints Bu liste sunucuda SOAP kullanan her endpoint için bir satır içerir ve default namespace, default database, session timeout ve WSDL dokumanının oluşturulmasında kullanılan stored procedure gibi bilgiler içerir.
sys.endpoint_webmethods Bu liste SOAP tanımlı her bir HTTP endpoint için bir satır içerir. Web metodun adını, web metodun çalıştıracağı nesne adını (fonksiyon veya stored procedure) ve sonuçların hangi formatta oluşturulacağını tanımlayan sütunlar içerir.


SQL Server:General Statistics (veya bir named instance için MSSQL$InstanceName:General Statistics) HTTP authenticated kullanıcılar, SOAP batch SQL talepleri, SOAP WSDL talepleri, başarısız ve başarılı olmuş SOAP talepleri gibi pek çok konuda bilgi edinmenizi sağlayabilecek performans monitörleri içermektedir. Kullandığımız sistemin performansını takip etmek ve gerekli güncelleme ve değişiklikleri yapmak için kullanmakta fayda var.

.NET vizyon lansmanından itibaren ürün yaygınlaştırma sunumlarının tamamında bahsettiğimiz aşamalardan biri olan "kısıtların kaldırılması" ve "sistemler arası entegrasyonun sağlanması" hedeflerinin başarılması için anahtar bir ürün olan SQL Server 2005'in Native XML Web Servis desteğini kısaca ele aldık. Gördüğünüz gibi, SQL Server 2005 ile birlikte clientlarımız artık hangi platformda, hangi programlama dilinde çalışıyor olursa olun, kendilerine gereken verileri TCP/IP'den sonra Internet'te oluşan en yaygın standart olan XML formatında, XML Web Servis altyapısıyla sunabilliyoruz. 

C# Client Örneği