14 Ocak 2008 Pazartesi

Native HTTP Desteği

Native HTTP Desteği

SQL Server 2005’e gelen yeniliklerinden biriside Native HTTP desteğidir. SQL Server; Stored Procedure, kullanıcı tanımlı fonksiyon ve Transact SQL sorgularını SAOP protokolunu kullanarak dış ortama aktarabilir. Bu özellik IIS olmadan SQL Server objelerini Web Servis olarak dışarıya açmak anlamına gelmektedir.

SQL Server’ın native HTTP desteği vermesinin asıl amacı farklı istemci uygulamaların SQL Server’a erişebilmesi sağlamaktır. Bu istemci uygulamalara windows tabanlı uygulamalar, web tabanlı uygulamalar ve konsol tabanlı uygulamalar sayılabilir. Bu uygulamalar farklı programla dilleriyle ve OLEDB, ODBC veya diğer özel erişim yöntemleri kullanılarak gerçekleştirilir.



Uygulamalar için Native HTTP desteğinin bir diğer bir alternatifi XML Web Servisleridir. XML Web Servisleri veriyi HTTP üzerinden XML olarak alır ve gönderir. XML Web Servisleri SQL Server 2005’in native HTTP desteği gibi platform ve dilden bağımsız olarak çalışır.

Native HTTP desteğinin XML Web Servislerinden en önemli farkı, IIS(Internet Information Services) ihtiyaç duymamasıdır.

Windows HTTP uygulama arayüzü olarak adlandırılan HTTP.sys, istemci makinadan aldığı HTTP isteklerini SQL Server’a iletir.

SQL Server DDL(Data Definition Language) deyimlerini, uygulamalara HTTP Endpoint’ler ile paylaştırır.

HTTP endpointleri oluşturmak için CREATE ENDPOINT, değiştirmek için ALTER ENDPOINT ve silmek için DROP ENDPOINT deyimi kullanılır.

CREATE ENDPOINT deyiminin kullanımı aşağıdaki gibidir.

CREATE ENDPOINT endPointName [AUTHORIZATION login]
STATE = { STARTED STOPPED DISABLED }
AS { TCP HTTP } (
PATH = 'url'
, PORTS = ({CLEAR SSL} [,... n])
[ SITE = {'*' '+' 'webSite' },]
[, CLEAR_PORT = clearPort ]
[, SSL_PORT = SSLPort ]
, AUTHENTICATION =({BASIC DIGEST INTEGRATED} [,...n])
[, AUTH_REALM = { 'realm' NONE } ]
[, DEFAULT_LOGON_DOMAIN = {'domain' NONE } ]
[, RESTRICT_IP = { NONE ALL } ]
[, COMPRESSION = { ENABLED DISABLED } ]
[,EXCEPT_IP = ({ <4-part-ip> <4-part-ip>: } [,...n])
)

Şimdi CREATE ENDPOINT deyiminin parametrelerini açıklayalım.

STATE = { STARTED STOPPED DISABLED }
EndPointlerin oluşturulduğu zamandaki durum bilgisini verir. Varsayılan değer STOPPED dır.

AS { TCP HTTP }
Kullanılacak protokol bilgisini verir.

PATH = 'url'
EndPoint’in path bilgisini tanımlar.

PORTS = ({CLEAR SSL} [,... n])
Dinleyici port bilgisini belirtir. Eğer CLEAR olarak tanımlanırsa gelen mesajlar HTTP, SSL tanımlanmış ise HTTPS olmalıdır.

[ SITE = {'*' '+' 'webSite' },]
Host edilen bilgisayarın adını belirtir.

[, SSL_PORT = SSLPort ]
Port bilgisi SSL olarak belirtilmiş ise, belirtilen SSL portunun numarasını verir. Varsayılan port numarası 443 dır.

AUTHENTICATION =({BASIC DIGEST INTEGRATED} [,...n])
Kullanılacak kimlik doğrulama bilgisini verir.

DEFAULT_LOGON_DOMAIN = {'domain' NONE } ]
Kimlik doğrulama tipi BASIC seçilmiş ise varsayılan domain bilgisini belirtir. Varsayılan değer NONE dır.

Şimdi CREATE ENDPOINT deyimini örnek içinde kullanalım. Öncelikle “Adres” isminde yeni bir veritabanı oluşturalım. Oluşturduğumuz veritabanın içerisine Kisi isminde bir tablo ekliyelim ve bu tablonun tüm kayıtlarını “spKisi” isminde bir stored procedure ile listeliyelim.

Use Master
GO
Create Database Adres
Go
Use Adres
Go
Create Table Kisi
(
ID int identity(1,1) Not Null,
Ad varchar(25) Not Null,
Soyad varchar(25) Not Null,
Adres varchar(60) Null
)
Go
Insert Into Kisi values('Tamer','ŞAHİNER','Bakırköy')
Insert Into Kisi values('Engin','ÖREN','Bakırköy')
Insert Into Kisi values('Yalçın','UZUN','Beşiktaş')
Insert Into Kisi values('Murat','HAKSAL','Bakırköy')
Go
CREATE PROC spKisi
AS
SELECT * FROM dbo.Kisi
GO


Oluşturduğumuz “spKisi” isimli stored procedure’ü CREATE ENDPOINT ile IIS kullanmadan Web Servis olarak dış ortama aktaralım.

CREATE ENDPOINT sql_Adres
STATE = STARTED
AS HTTP(
PATH = '/Adres/Kisi',
AUTHENTICATION = (INTEGRATED),
PORTS = ( CLEAR ))
FOR SOAP(
WEBMETHOD 'spKisi'
(name='Adres.dbo.spKisi',
FORMAT=ROWSETS_ONLY),
WSDL = DEFAULT,
DATABASE = 'Adres',
NAMESPACE = 'http://localhost/Adres/'
)
GO

Oluşturduğumuz web servisine http://localhost/Adres/Kisi?WSDL adresinden erişebilirsiniz.

Şimdi bu web servisine oluşturacağımız yeni bir Windows Application ile erişelim.

Oluşturduğumuz projenin “Solution Explorer” penceresindeki proje ismi üzerinde farenin sağ tuşu tıklanır. Açılan kısayol menüsünden “Add Web Reference” komutu seçilir.

Açılan “Add Web Reference” penceresinin URL isimli metin kutusuna http://localhost/Adres/Kisi?WSDL değerini, Web reference name isimli metin kutusuna “AdresWebServis” değerini yazın ve “Add Reference” butonunu tıklayın.





Form1 nesnesinin üzerine btnListele isimli bir Button ve lstKisi isimli ListBox ekleyin. Formun görüntüsü aşağıdaki gibi olacaktır.





btnListele butonunun Click olayına aşağıdaki kodu ekleyin.

Private Sub btnListele_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnListele.Click
Dim proxy As New AdresWebServis.sql_Adres
proxy.Credentials = _
System.Net.CredentialCache.DefaultCredentials
Dim ds As System.Data.DataSet = proxy.Adres
For Each r As System.Data.DataRow In ds.Tables(0).Rows
lstKisi.Items.Add(r("ad").ToString() & " " & _
r("soyad").ToString())
Next
End Sub

Sonuç aşağıdaki gibi olacaktır.



Başka bir makalede görüşmek üzere...
Tamer ŞAHİNER
Tamer.sahiner@bilgeadam.com

3 yorum:

Adsız dedi ki...

Hocam gerçekten çok faydalı bir yazı olmuş. Sql Server ile ilgili yazılarınızın devamını bekliyorum.

Adsız dedi ki...

Hocam tesekkur ederiz. Ama size bir sorum olacak. oluşturduğumuz end point explorer üzerinden çağırdığımız zaman şifre soruyor. Bunu nasıl düzeltebiliriz?
AUTHENTICATION = (integrated), olarak tanımladım.
Tekrar tesekkurler

Sinan BARAN dedi ki...

Hocam Supersiniz.