SQL SERVER 2008 ile Web Service Yazmak

SQL SERVER 2008 ile Web Service Yazmak

HTTP ENDPOINTS

SQL Server içinde bir end point oluşturarak kullanıcıların bu endpointlere http aracılığıyla ulaşmasını sağlayabiliriz.Örneğin Product tablosundaki kayıtları endpoint’ler aracılığıyla yayınlamak istiyoruz.Bu durumda bir adet stored procedure yapmamız,ardından da,bu stored procedure için bir end point tanımlamamız gerekir.End point tanımlandıktan sonra SQL Server portarı dinlemeye başlar.Belirtilen end point talep edildiği zaman client tarafında proxy oluşturulur ve client bu store procedure’ü dışarıdan kullanabilir hemde client tarafında hangi işletim sistemi,hangi yazılım dili olduğuna bakılmaksızın.Çalışma mantığı web service gibidir.

ÖRNEK: Product tablosunu kullanarak,renge göre ürünleri döndüren bir store procedure tanımlayıp,bu stored procedure’ü endpoint ile yayınlayalım.

Önce stored procedure’ü tanımlayalım;

CREATE PROCEDURE GetProductsByColor(      @color NVARCHAR(20))

AS

BEGIN

SELECT ProductID,[Name],Color,ListPrice

FROM Production.Product

WHERE Color LIKE ‘%’+@color+’%’

END

Ardından bu store procedure ile bir end point’i ilişkilendirelim;

CREATE ENDPOINT GetProductsByColorEndPointSTATE=STARTEDAS HTTP(PATH=’/sql/GetProductsByColor’,

AUTHENTICATION=(INTEGRATED),

PORTS=(CLEAR))

FOR SOAP(WEBMETHOD ‘GetProductsByColor’

(NAME=’AdventureWorks.dbo.GetProductsByColor’,

SCHEMA=STANDARD),

BATCHES=ENABLED,

WSDL=DEFAULT,

SCHEMA=STANDARD,

DATABASE=’AdventureWorks’,

NAMESPACE=’http://tempUri.org/)

STATE: Bu durum 3 değer alabilir.STARTED,STOPPED,DISABLED.Eğer STOPPED olarak ayarlanır ve client bir talepde bulunursa hata fırlatılır.DISABLED olarak ayarlanır ise,gelen taleplere yanıt verilmez.STARTED ise,çalışması devam eder.

PATH: Client’ın bu endpoint’e ulaşması için gerekli URL bilgisini tanımlar.Yukarıdaki örnekte bu URLhttp://localhost/sql/GetproductsByColor olacaktır.

AUTHENTICATION: Endpoint’ erişmek için gerekli authentication tipi tanımlanır.Client’ın bu endointten yararlanabilmesi için WINDOWS kullanıcı adı ve şifresine ihtiyacı vardır.

WEBMETHOD: Client,bu endpoint’i kullanabilmesi için kod içerisinde bir metod çağırmalıdır.Burada verdiğimiz isim,client yazılımında kullanılacak olan metoddur.

NAME: Bu webmethod’un işleteceği stored procedure’ün adı beliritilir.

SCHEMA: SELECT ifadesi sonucunda SOAP yanıtlarında(request) XSD dökümanının SOAP paketiyle birlikte gönderilmesi veya gönderilmemesi durumunu ifade eder.STANDARD ise gönderilir,NONE ise gönderilmez.

BATCHES: Client’ın server’da SQL cümleciklerine izin verilip verilmeme durumudur.Her zaman DISABLE edilmelidir.Diğer türlü hacker’ların saldırılarına açık hale getirmiş oluruz.

WSDL: Endpoint’in sonuna ?WSDL yazarak,endpoint için tanımlanan WSDL dökümanı elde edilebilir. WSDL’in elde edilip edilememe durumu belirtilir.DEFAULT ise elde edilebilir demektir.

SCHEMA: Eğer sorgu sonucunda dönen değeri DataSet içinde elde etmek istiyor iseniz bu durumda DEFAULT olarak belirlemeniz gerekir.XSD’in gönderilip gönderilmeme durumunu belirtir.

DATABASE: Store Procedure’ün yüklü olduğu veri tabanını ifade eder.

NAMESPACE: Biricik bir namespace verilir.

Endpoint’imizi tanımladıktan sonra şimdide .NET’de bunu kullanalım.Bir adet Windows Application açıp arayüzü şu şekilde tasarlayalım;

Ardından projemize sağ tıklayıp Add Web Refrence dedikten sonra endpoint adresini (http:\\localhost\sql\GetProductsByColor) girelim.

Bizden authentication için kullanıcı adı ve şifre isteyecektir.Bilgisayarın kullanıcı adı ve şifresini girdikten sonra  yetkilendirme tamamlanacak ve webmetho listelenecektir.Ardından Add Reference diyelim ve reference sınıfımızın oluşmasını sağlayalım.

‘Ürünleri Getir’ butonuna tıklandığında çalışacka olan şu şekildedir;

private void btnUrunleriGetir_Click(object sender, EventArgs e) {    GetProductsByColorEndPoint proxy = new GetProductsByColorEndPoint();proxy.Credentials = CredentialCache.DefaultCredentials;

object[] results = proxy.GetProductsByColor(txtRenk.Text);

DataSet ds = results[0] as DataSet;

gvProducts.DataSource = ds.Tables[0];

}

 

ÖRNEK: Kişi tablosunda Id,Ad,Soyad alanları var,iki adet end poin tanımlanacak,Kisi ekleme ve görüntüleme işi yapılabilecek.

Store Procedures:

CREATE PROCEDURE KisiEkle(      @ad   NVARCHAR(50),@soyad      NVARCHAR(50)

)

AS

BEGIN

INSERT INTO Kisi VALUES(@ad,@soyad)

END

CREATE PROCEDURE KisileriGetir

AS

BEGIN

SELECT Id,Ad,Soyad FROM Kisi

END

End Point:

CREATE ENDPOINT KisiIslemleriEndPointSTATE=STARTEDAS HTTP(PATH=’/sql/KisiIslemleri’,

AUTHENTICATION=(INTEGRATED),

PORTS=(CLEAR))

FOR SOAP(

WEBMETHOD ‘KisiEkle’

(NAME=’Okul.dbo.KisiEkle’),

WEBMETHOD ‘KisileriGetir’

(NAME=’Okul.dbo.KisileriGetir’),

BATCHES=ENABLED,

WSDL=DEFAULT,

SCHEMA=STANDARD,

DATABASE=’Okul’,

NAMESPACE=’http://tempUri.org/’)

Arayüzü tanımladıktan sonra,ekleme ve listeleme işlemleri için komutlar şu şekilde olacaktır.

Ekleme:

KisiIslemleriEndPoint proxy = new KisiIslemleriEndPoint();proxy.Credentials = CredentialCache.DefaultCredentials;proxy.KisiEkle(txtAd.Text, txtSoyad.Text);

Listeleme:

object[] arr = proxy.KisileriGetir();DataSet ds = arr[0] as DataSet;dataGridView1.DataSource = ds.Tables[0];

ÖRNEK: Internet üzerinden backup(full,differential,transaction log) alma komutunu verebileceğim bir yapı oluşturun.

Store Procedure:

 

ALTER PROCEDURE YedekAl(      @tur  INT)

AS

BEGIN

IF @tur = 1

BEGIN

BACKUP DATABASE Okul TO DISK=’C:\Backup\okul.bak’

END

IF @tur = 2

BEGIN

BACKUP DATABASE Okul TO DISK=’C:\Backup\diffokul.bak’

WITH DIFFERENTIAL

END

IF @tur = 3

BEGIN

BACKUP LOG Okul TO DISK=’C:\Backup\trn1.trn’

END

END

HTTP End Point:

 

CREATE ENDPOINT BackupEndPointSTATE=STARTEDAS HTTP(PATH=’/sql/Backup’,

AUTHENTICATION=(INTEGRATED),

PORTS=(CLEAR))

FOR SOAP(

WEBMETHOD ‘YedekAl’

(NAME=’Okul.dbo.YedekAl’),

BATCHES=ENABLED,

WSDL=DEFAULT,

SCHEMA=STANDARD,

DATABASE=’Okul’,

NAMESPACE=’http://tempUri.org/’)

Ardından bir ASP.NET projesi açıp,DropDownList’e Full,Differential,Transaction Log  kayıtlarını ekleyip sırasıyla value değerlerine 1,2,3 aktarıyoruz.Projemize sağ tıklayıp http end point’i web service olarak ekliyoruz ve button click eventi için şu metodu gerçekleştiriyoruz;

BackupEndPoint proxy = new BackupEndPoint();proxy.Credentials = CredentialCache.DefaultCredentials;proxy.YedekAl(int.Parse(DropDownList1.SelectedValue));

Response.Write(“Yedek alındı”);

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s