tag:blogger.com,1999:blog-6501107854818923929.post-20134868940462127002008-01-14T06:38:00.000-08:002008-01-14T06:48:29.189-08:00Native HTTP Desteği<strong>Native HTTP Desteği</strong><br /><br />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.<br /><br />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.<br /><br /><a href="http://1.bp.blogspot.com/_ybjaTHsa6dA/R4t0J520L0I/AAAAAAAAAD8/JzRdhqDLnjA/s1600-h/1000000471_image001.jpg"><img id="BLOGGER_PHOTO_ID_5155341911954042690" style="CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_ybjaTHsa6dA/R4t0J520L0I/AAAAAAAAAD8/JzRdhqDLnjA/s400/1000000471_image001.jpg" border="0" /></a><br /><br />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.<br /><br />Native HTTP desteğinin XML Web Servislerinden en önemli farkı, IIS(Internet Information Services) ihtiyaç duymamasıdır.<br /><br />Windows HTTP uygulama arayüzü olarak adlandırılan HTTP.sys, istemci makinadan aldığı HTTP isteklerini SQL Server’a iletir.<br /><br />SQL Server DDL(Data Definition Language) deyimlerini, uygulamalara HTTP Endpoint’ler ile paylaştırır.<br /><br />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.<br /><br />CREATE ENDPOINT deyiminin kullanımı aşağıdaki gibidir.<br /><br /><span style="color:#3333ff;">CREATE ENDPOINT endPointName [AUTHORIZATION login]<br />STATE = { STARTED STOPPED DISABLED }<br />AS { TCP HTTP } (<br />PATH = 'url'<br />, PORTS = ({CLEAR SSL} [,... n])<br />[ SITE = {'*' '+' 'webSite' },]<br />[, CLEAR_PORT = clearPort ]<br />[, SSL_PORT = SSLPort ]<br />, AUTHENTICATION =({BASIC DIGEST INTEGRATED} [,...n])<br />[, AUTH_REALM = { 'realm' NONE } ]<br />[, DEFAULT_LOGON_DOMAIN = {'domain' NONE } ]<br />[, RESTRICT_IP = { NONE ALL } ]<br />[, COMPRESSION = { ENABLED DISABLED } ]<br />[,EXCEPT_IP = ({ <4-part-ip> <4-part-ip>:<mask> } [,...n])<br />)<br /></span><br />Şimdi CREATE ENDPOINT deyiminin parametrelerini açıklayalım.<br /><br />STATE = { STARTED STOPPED DISABLED }<br />EndPointlerin oluşturulduğu zamandaki durum bilgisini verir. Varsayılan değer STOPPED dır.<br /><br />AS { TCP HTTP }<br />Kullanılacak protokol bilgisini verir.<br /><br />PATH = 'url'<br />EndPoint’in path bilgisini tanımlar.<br /><br />PORTS = ({CLEAR SSL} [,... n])<br />Dinleyici port bilgisini belirtir. Eğer CLEAR olarak tanımlanırsa gelen mesajlar HTTP, SSL tanımlanmış ise HTTPS olmalıdır.<br /><br />[ SITE = {'*' '+' 'webSite' },]<br />Host edilen bilgisayarın adını belirtir.<br /><br />[, SSL_PORT = SSLPort ]<br />Port bilgisi SSL olarak belirtilmiş ise, belirtilen SSL portunun numarasını verir. Varsayılan port numarası 443 dır.<br /><br />AUTHENTICATION =({BASIC DIGEST INTEGRATED} [,...n])<br />Kullanılacak kimlik doğrulama bilgisini verir.<br /><br />DEFAULT_LOGON_DOMAIN = {'domain' NONE } ]<br />Kimlik doğrulama tipi BASIC seçilmiş ise varsayılan domain bilgisini belirtir. Varsayılan değer NONE dır.<br /><br />Ş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.<br /><br /><span style="color:#3333ff;">Use Master<br />GO<br />Create Database Adres<br />Go<br />Use Adres<br />Go<br />Create Table Kisi<br />(<br />ID int identity(1,1) Not Null,<br />Ad varchar(25) Not Null,<br />Soyad varchar(25) Not Null,<br />Adres varchar(60) Null<br />)<br />Go<br />Insert Into Kisi values('Tamer','ŞAHİNER','Bakırköy')<br />Insert Into Kisi values('Engin','ÖREN','Bakırköy')<br />Insert Into Kisi values('Yalçın','UZUN','Beşiktaş')<br />Insert Into Kisi values('Murat','HAKSAL','Bakırköy')<br />Go<br />CREATE PROC spKisi<br />AS<br />SELECT * FROM dbo.Kisi<br />GO<br /></span><br /><br />Oluşturduğumuz “spKisi” isimli stored procedure’ü CREATE ENDPOINT ile IIS kullanmadan Web Servis olarak dış ortama aktaralım.<br /><br /><span style="color:#3333ff;">CREATE ENDPOINT sql_Adres<br />STATE = STARTED<br />AS HTTP(<br />PATH = '/Adres/Kisi',<br />AUTHENTICATION = (INTEGRATED),<br />PORTS = ( CLEAR ))<br />FOR SOAP(<br />WEBMETHOD 'spKisi'<br />(name='Adres.dbo.spKisi',<br />FORMAT=ROWSETS_ONLY),<br />WSDL = DEFAULT,<br />DATABASE = 'Adres',<br />NAMESPACE = 'http://localhost/Adres/'<br />)<br />GO<br /></span><br />Oluşturduğumuz web servisine <a href="http://localhost/Adres/Kisi?WSDL">http://localhost/Adres/Kisi?WSDL</a> adresinden erişebilirsiniz.<br /><br />Şimdi bu web servisine oluşturacağımız yeni bir Windows Application ile erişelim.<br /><br />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.<br /><br />Açılan “Add Web Reference” penceresinin URL isimli metin kutusuna <a href="http://localhost/Adres/Kisi?WSDL">http://localhost/Adres/Kisi?WSDL</a> değerini, Web reference name isimli metin kutusuna “AdresWebServis” değerini yazın ve “Add Reference” butonunu tıklayın.<br /><br /><a href="http://4.bp.blogspot.com/_ybjaTHsa6dA/R4t1Gp20L1I/AAAAAAAAAEE/sSYsBE6w9Ow/s1600-h/1000000471_image003.jpg"><img id="BLOGGER_PHOTO_ID_5155342955631095634" style="CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_ybjaTHsa6dA/R4t1Gp20L1I/AAAAAAAAAEE/sSYsBE6w9Ow/s400/1000000471_image003.jpg" border="0" /></a><br /><br /><br /><br />Form1 nesnesinin üzerine btnListele isimli bir Button ve lstKisi isimli ListBox ekleyin. Formun görüntüsü aşağıdaki gibi olacaktır.<br /><br /><a href="http://2.bp.blogspot.com/_ybjaTHsa6dA/R4t1RJ20L2I/AAAAAAAAAEM/IjcQ7v1g0AE/s1600-h/1000000471_image004.jpg"><img id="BLOGGER_PHOTO_ID_5155343136019722082" style="CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_ybjaTHsa6dA/R4t1RJ20L2I/AAAAAAAAAEM/IjcQ7v1g0AE/s400/1000000471_image004.jpg" border="0" /></a><br /><br /><br /><br />btnListele butonunun Click olayına aşağıdaki kodu ekleyin.<br /><br /><span style="color:#3333ff;">Private Sub btnListele_Click(ByVal sender As System.Object, _<br />ByVal e As System.EventArgs) Handles btnListele.Click<br />Dim proxy As New AdresWebServis.sql_Adres<br />proxy.Credentials = _<br />System.Net.CredentialCache.DefaultCredentials<br />Dim ds As System.Data.DataSet = proxy.Adres<br />For Each r As System.Data.DataRow In ds.Tables(0).Rows<br />lstKisi.Items.Add(r("ad").ToString() &amp; " " &amp; _<br />r("soyad").ToString())<br />Next<br />End Sub<br /></span><br />Sonuç aşağıdaki gibi olacaktır.<br /><br /><a href="http://3.bp.blogspot.com/_ybjaTHsa6dA/R4t1fZ20L3I/AAAAAAAAAEU/-GuzDKBjCYE/s1600-h/1000000471_image005.jpg"><img id="BLOGGER_PHOTO_ID_5155343380832857970" style="CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_ybjaTHsa6dA/R4t1fZ20L3I/AAAAAAAAAEU/-GuzDKBjCYE/s400/1000000471_image005.jpg" border="0" /></a><br /><br />Başka bir makalede görüşmek üzere...<br />Tamer ŞAHİNER<br /><a href="mailto:Tamer.sahiner@bilgeadam.com">Tamer.sahiner@bilgeadam.com</a><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6501107854818923929-2013486894046212700?l=tamersahiner.blogspot.com'/></div>tamersahinerhttp://www.blogger.com/profile/00797131681729869275noreply@blogger.com1