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