SQL Server 2005 - Hızlı El Kitabı
Skip Navigation Links.

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 GetProductsByColorEndPoint

STATE=STARTED

AS 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 URL http://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 KisiIslemleriEndPoint

STATE=STARTED

AS 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 BackupEndPoint

STATE=STARTED

AS 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ı");