Kendi blogunu oluştur ;)
WebmastersRSSYorum RSS
39 tane "xml" etiketli yazı bulundu (sayfa 1)"xml" tagli diger ogeler resimler , videolar

ADO.NET ile Verileri XML’e Çevirme İşlemleri 

Yakın bir gelecekte XML her uygulama için vazgeçilmez bir parça olacak. ADO.NET ile XML kullanımı oldukça kolaylaştırılmıştır. Makalemizde ADO.NET ile verileri nasıl XML formatına çevireceğimizi inceleyeceğiz. Veritabanınızda bulunan verileri XML formatına çevirerek diğer programlarla paylaşabilirsiniz. Uzakta bulunan bir program veya bir web projesi olabilir. Bunların XML sayesinde haberleşmeleri oldukça kolay , güvenli ve hızlı olacaktır. Öncelikle XML metin tabanlı olduğu için bir veri tabanı kadar yer kaplamaz. Ateş duvarlarına yakalanma riski yoktur ve yapısı oldukça basittir. Uyeler.xml dosyamı ben bir sunucuya yollayarak ana makinedeki bilgileri sürekli güncel tutabilirim veya web sitemin haber kısmında kullanıp sitemde bulunan haberleri XML sayesinde herkesle paylaşabilirim. Bunlar gibi örnekler çoğaltılabilir.
Bu makale için hazırladığım örnekte bir access dosyası kullandım. Örnek program ile bu veritabanına bağlanıp dataset içine aldığımız verileri bir XML dosyası olarak kaydedeceğiz.
uyeler isimli tablonun içeriği aşağıda.

Dataset içine aldığımız veriler yapısı aynen kalacak şekilde XML biçiminde saklanmaktadır. XML olarak alınan verileri istediğimiz gibi kullanabiliriz. Bütün bunları yaparken tüm olaylar Dataset içinde olur. Veritabanı ile bağlantı yoktur. Eğer veritabanında güncellenmesi gereken bir işlem yaparsak işlemlerimiz bittikten sonra veritabanı bağlantımız açıp veritabanını güncellememiz gerekir. Bir veritabanına bağlanıp bu tablonun içinde olan verileri dataset içine alıyorum.

//objConn değişkenini OleDbConnection nesnesi olarak tanımlıyorum.
// Benim bilgisayarımda projemin olduğu klasörden uye.mdb dosyasını bağlantı gerçekleştiriyorum .

OleDbConnection objConn = new OleDbConnection (”Provider=Microsoft.Jet.OLEDB.4.0;DATA Source=C:\Documents and Settings\TShark\My Documents\Visual Studio Projects\datasetXML \uye.mdb”);
//Veritabanını açıyoruz.
objConn.Open();
//dset değişkenini DataSet olarak tanımlıyoruz.
DataSet dset= new DataSet();
// comstr değişkenini string olarak tanımlayıp SQL sorgumuzu bu değişkene atıyoruz.
String comstr = “SELECT * FROM uyeler”;
// com değişkenini OleDbCommand nesnesi olarak tanımlıyoruz.
OleDbCommand com = new OleDbCommand ( comstr, objConn);
/* adapt değişkenini OleDbDataAdapter nesnesi olarak tanımlıyoruz. Ve com değişkeninde bulunan komutu çalıştırıyoruz. Buraya kadar olan kısımda veri tabanına bağlanıp bir SQL sorgusu çalıştırdık. */
OleDbDataAdapter adapt = new OleDbDataAdapter ( com );
// Dataadapter içindeki verileri datasetin içine dolduruyoruz.

adapt.Fill ( dset, “uyeler” );
// Datasete verilerimizi aldıktan sonra bir çok işlem yapabiliriz. Bunlardan bir kaçına örnek yapalım

*Veritabanına bağlandık ve verileri Dataadapter vasıtasıyla Datasete doldurduk.

Buradan sonra veriler datasetimiz içinde bir XML olarak bulunuyor. Datasete vereceğimiz komutla veritabanında bulunan verileri bir xml dosyası olarak alabiliriz. Yukarıda yazdığımız satıra alttaki komutu ilave edin.

dset.WriteXml ( “uyeler.xml” );

uyeler.xml dosyamızın içeriği alttaki gibi olacaktır. Bu içeriğin şemasını yukarıda yapmış olduğumuz veritabanından almaktadır.

<?xml version=”1.0″ standalone=”yes” ?>
<NewDataSet>
<
uyeler>

<
uyeid>1</uyeid>

<
uyeadi>tugrul</uyeadi>

<
uyeyasi>28</uyeyasi>

<
uyecinsi>1</uyecinsi>

</
uyeler>
<
uyeler>

*Üstteki veritabanı ve XML arasındaki şema aynıdır. Yani bu xml dosyası veritabanının XML biçimli birebir kopyasıdır.

Çalışma anında XML çıktısı almak

Buraya kadar olan bölüm bir dosyaya çıktı veriyordu. Siz programınızın içinde bu XML verilerine ihtiyacınız olabilir. Alttaki örnekte GetXml komutuyla Textbox1 isimli yazı kutucuğuna(MultiLine olmalı) dataset içinde bulunan verileri xml formatında yazdırıyoruz.

textBox1.Text = dset.GetXml();

*Xml içeriğini istediğimiz bir nesneye yönlendirebiliriz.

Buraya kadar yaptıklarımızı biraz toparlayıp örnek bir program hazırlayalım. Bunun için Visual Studio.NET ile yeni bir C# Windows uygulaması açın.Alttakine benzer bir datagrid , bir textbox (multiLine olmalı), bir tane de button ve System.Data ve Systemdata.Oledb isim alanlarını ekleyelim.

private void button1_Click(object sender, System.EventArgs e)
{
OleDbConnection objBaglanti = new OleDbConnection(”Provider=Microsoft.Jet.OLEDB.4.0;DATA Source=C:\Documents and Settings\TShark\My Documents\Visual Studio Projects\datasetXML\uye.mdb”);
objBaglanti.Open();
DataSet dset= new DataSet();
String comstr = “SELECT * FROM uyeler”;
OleDbCommand com = new OleDbCommand ( comstr, objBaglanti );
OleDbDataAdapter adapt = new OleDbDataAdapter ( com );
adapt.Fill ( dset, “uyeler” );
datagrid1.SetDataBinding ( dset, “uyeler” );
dset.WriteXml ( “uyeler.xml” );
textBox1.Text = dset.GetXml();
objBaglanti.Close( );
}

Özellikle son yıllarda globalleşme, uluslararası ilişkiler gibi kavramları oldukça sık duymaktayız. Ben .NET teknolojisi ve XML Web Servislerinin internette bilgi paylaşımını arttıracağına ve sanal dünyada da bir bakıma globalleşme başlayacağına inanıyorum. Sanal Dünyada teknoloji ilerledikçe küçülüyor.

SQL SERVER 2000 içinde T-SQL ve XML ilişkisi 

Bu makalede sizlerle verileri başka bir platformdan XML olarak çekeceğiz. Bildiğiniz gibi SQL Server 2000 ile birlikte SQL Server 2000 için XML desteği geldi. Yani bu bize SQL Server 2000 ’e T-SQL ile yaptığınız sorgulamaların cevaplarını XML formatında alabilmemizi sağladı.

Hazırladığımız tblUye tablosundaki uyeleri sorgulayarak verilerimiz XML formatında alalım. Bu sorgu için Sql Server 2000 Query Analyzer Kullanacağım. İlk sorgumu geçerli özelliklerle yapıyorum :

SELECT * FROM tblUye FOR XML AUTO

Dönecek değer bir XML ifadesidir. Her kayıt için bir satır yaratılmış, satırdaki veriler değer olarak eklenmiştir.

Bu ifadeyi alttaki şekilde değişterelim;

SELECT * FROM tblUye FOR XML RAW

Dönecek değer yine aynıdır tek değişiklik her kayıt için dönen değer ’row’ ile başlayacaktır.

Şimdiki sorgumuz ise en çok kullandığım komuttur. Dönen değer alışık olduğumuz basit bir XML ifadesi olarak dönmektedir.

SELECT * FROM tblUye WHERE uyeyas between 26 AND 28 FOR XML AUTO, ELEMENTS

bundan dönen değer ise;

Veriler XML formatında dönecektir.

şeklinde olacaktır.

Bu komut bize her satırdaki her alan için ayrı bir XML etiketi açmaktadır. Ayrıca dikkat çekmek istediğim diğer bir nokta ise parametreli sorgulamayı XML AUTO, ELEMENTS ifadesinden önce yapmamızdır. SQL Sorgunuz ne kadar uzun ve karışık olursa olsun kodun en sonuna eklenecek FOR XML ile gelen tüm veriyi XML formatında alabilirsiniz.

XML değerinin şema bilgilerinide çekebilmeniz için alttaki komutu kullanmanız gerekiyor.

SELECT * FROM tblUye FOR XML RAW, XMLDATA

Bu komuta parametre verseniz bile dönen değerin değişmediğine dikkat ediniz.

SELECT * FROM tblUye WHERE uyeyas between 26 AND 28 FOR XML RAW, XMLDATA

Dönen değer verilerin şema bilgilerini içerecektir.

.NET ile “XML Serialization” ve “Deserialization” İşlemleri 

Serialization(serileştirme) kısaca nesnenin(object) bir kopyasını kullanarak o kopyayı kolayca ulaşılabilir bir forma çevirme ve nesnenin o anki durumunu koruma işlemidir. Serialization işlemini 3 farklı yöntemle gerçekleştirebiliriz. Bu yöntemler: Binary, SOAP ve XML�dir. Serialize(serileştirme) ettiğimiz nesneyi orjinal haline getirme işlemine ise Deserialization denir. Serialization işlemi uygulanmış olan nesnemiz biz Deserialization işlemi uygulamadıkça belirttiğimiz yerde kullandığımız Serialization(Binary, SOAP veya XML) formatındadır. Bu sayede nesnenin ömrü uygulamanın ömrüne bağlı olmaktan çıkar. Örneğin bu sayede bir uygulamayı sonlardırdığımız da verinin son durumunu ağ üzerindeki başka bir arkadaşımıza göndererek o arkadaşımızın verinin son halini kullanmasını sağlayabiliriz.

Biz şimdi bu formatlardan XML Serialization ve .NET Framework�ün bize bu işlem için sunduğu System.Xml.Serialization namespace�ine bakalım.

İsterseniz konumuza girmeden önce aşağıda ki sorunun cevaplarını bir inceleyelim :

Neden XML Serialization kullanalım?

     

  • Verileri farklı uygulamalarda kullanmak için,
  • Verileri Internet üzerinden taşımak için. XML Serialization yapmamızın en önemli nedeni, XML�in open standart(açık standart) bir dil olması
  • Verilerin Internet üzerinden kolay bir şekilde aktarımını ve paylaşımını sağlamaktadır.
  • Bir uygulamaya dışarıdan XML verilerini almak için. Örneğin; bir ADO.NET uygulamasında XML verisini Deserialize edip o veriyi Dataset içinde kullanabiliriz.
  • Bir uygulamadaki nesnelerin son durumlarını korumak için.

Tabiki XML Serialization işleminin bazı kısıtlamaları var. Bunlar:

     

  • Sadece public property(özellik) ve field�ler(alanlar) serialize(serileştirme) edilebilir.
  • Metot ve indeksleyiciler ile private tanımlanan üye elemanlar serileştirilemez.
  • Sadece verinin kendisi ve sınıfımızın yapısı serialize edilir. Veritipleri ve assembly bilgileri serileştirilmez.
  • Serileştirilecek sınıfta mutlaka bir varsayılan yapıcı metot bulunmak zorunda.
Eğer serialize edeceğimiz sınıf nesnesi yukarıda yazılı kısıtlamaları içeriyorsa Binary veya SOAP Serialization yöntemlerinden uygun bir tanesini seçmeliyiz.

XML Serialization�a genel olarak baktıktan sonra Serialization ve Deserialization işlemlerini gerçekleştirmek için kullanacağımız ve System.Xml.Serialization isim alanı içinde bulunan XmlSerializer sınıfına bir göz atalım

Sınıfımızın Serialize ve Deserialize işlemlerinde kullanılmak üzere 3 adet metodu bulunmaktadır. Bunlar:

Serialize() Nesneleri XML olarak serileştirmek için kullanılır.

Deserialize() XML olarak serileştirmiş veriden nesne oluşturmak için kullanılır.

CanDeserialize() Verinin deserialize işlemine tabi tutulup tutulamayacağına karar verebilmemiz için kullanılır.

İsterseniz örnek bir uygulama üzerinde bu metotların kullanımını görelim.

1. Uygulamamız için “Windows Application” şablonunu seçiyoruz ve formumuza 5 adet Textbox, 2 adet Groupbox, 2 adet Button, 1 adet DateTimePicker ve 1 adet ComboBox ekliyoruz. Formumuzun görünümü şekilde görüldüğü olacak.

2. Projemize Serialize işlemi için kullanacağımız aşağıdaki gibi bir tane sınıf bildirimi ekliyoruz. Ve bu sınıf içerisinde(aynı isim alanında olmak üzere) ikinci bir sınıf daha bildiriyoruz.

public class Personel
{
public

string Ad;
public string Departman;
public string Email;
public int Yas;
public Para Maas;
public DateTime GirisTarihi;
}

public class Para
{
public string Birim;
public decimal Tutar;
}

3. Sınıflarımızı oluşturduktan sonra Formumuza dönüyor ve öncelikle kullanacağımız sınıflar için gerekli olan isim alanlarını aşağıdaki gibi formumuza ekliyoruz.

using System.Text;
using System.IO;
using System.Xml.Serialization;

4 . Serileştirilecek nesnemizi tutmak için sınıf seviyesinde bir string değişken yaratıyoruz.

string strPersonelData;

5. Artık sıra Serialization işlemini gerçekleştirmek için gereken kodları yazmaya geldi. Bunun için Serialize butonumuzun Click olayının altına aşağıdaki kodu yazıyoruz.

private void btnSerialize_Click(object sender, System.EventArgs e)
{
// Yeni bir Personel Sınıfı Yaratıyoruz Personel

 

yeniPersonel= new Personel();

// Personel Bilgilerini Personel nesnesine kaydediyoruz.

yeniPersonel.Ad=txtName.Text;
yeniPersonel.Departman=txtDept.Text;
yeniPersonel.Email=txtMail.Text;
yeniPersonel.Yas= int.Parse(txtAge.Text);
yeniPersonel.GirisTarihi=Convert.ToDateTime(dtpHireDate.Value.ToShortDateString());

// Maaş Bilgilerini Personel sınıfı altında tutmak için
// yeni bir Para Sınıfı yaratıyor ve Bilgileri kaydediyoruz.

yeniPersonel.Maas=new Para();
yeniPersonel.Maas.Tutar=Convert.ToDecimal(txtAmount.Text);
yeniPersonel.Maas.Birim=cmbCurrency.SelectedItem.ToString();

// Serialize edilmiş olan nesneyi tutacak değişkene fonksiyonumuzun
// geri dönüş değerini atıyoruz ve Messagebox kullanarak gösteriyoruz.

strPersonelData = SerializeObject(yeniPersonel);

MessageBox.Show(strPersonelData);
}

6. Şimdi de Serialization işlemini gerçekleştirecek olan metodumuzu yazıyoruz.
//Nesnemizi Serialize ederken kullanacağımız metot
private string SerializeObject(Personel PersObject)
{
// Yeni bir XmlSerializer nesnesi yaratıyoruz ve Serialize
// edilecek sınıfımızın adını Constructor parametresi olarak gönderiyoruz.

 

XmlSerializer MySerializer = new XmlSerializer(typeof (Personel));

// XML olarak Serialize edilmiş nesnemizi tutacak olan StringWriter yaratıyoruz.
TextWriter TW = new StringWriter();

// Yarattığımız XmlSerializer’ın Serialize Metodunu kullanarak
// nesnemizi Serialize ediyoruz.
MySerializer.Serialize(TW, PersObject);

// Serialize edilmiş nesneyi geri döndürüyoruz.
return TW.ToString();
}

7. Bu işlemleri yaptıktan sonra uygulamamızı çalıştırdığımızda karşımıza çıkacak olan Dialog Kutusu aşağıdaki gibi olacaktır.


8 . Serialize edilmiş bir veriyi Deserialize etmek istersek ne yapmamız lazım sorusunun cevabını aşağıda yazılı kodları inceleyelerek göreceğiz ama öncelikle geri dönüş değerini göstermek için bir adet Form tasarlayalım. Bu formumuza istediğimiz adı verdikten sonra formumuza 1 adet TextBox ve 1 adet Button ekliyoruz. Formumuzun görüntüsü şekildeki gibi olacak.


9. Deserialize edilmiş veriyi gösterecek olan bu formumuzun sadece Kapat butonunun Click eventine aşağıdaki kodu yazıyoruz.

private void btnExit_Click(object sender, System.EventArgs e)
{
this.Dispose();
}

10. İkinci formumuzun tasarımı bittikten sonra Deserialization işlemine geçelim. Bunu yapmak için Main Form sınıfımıza aşağıdaki kodları eklememiz yeterli olacaktır. Gerekli olan açıklamalar kodların üzerinde yazdığı için ekstra açıklama yapma gereği görmüyorum.

private void btnDeserialize_Click(object sender, System.EventArgs e)
{
// Deserialization işlemini gerçekleştirmek için kullanacağımız
// metodu çağırıyor ve parametre olarak Deserialization işlemine tabi tutacağımız veriyi gönderiyoruz.

 

DeserializeXml(strPersonelData);
}

// Deserialization işlemi için kullanılacak olan metod
private void DeserializeXml(string XmlData)
{
// Yeni bir Personel Nesnesi Yaratıyoruz Personel ReturnedEmployee;
// DeSerialize işleminde kullanılmak üzere yeni bir XmlSerializer
// nesnesi yaratıyor ve Serialize edilmiş verinin hangi nesne(Class) tipine çevirileceğini gösteriyoruz.
XmlSerializer MyDeserializer = new XmlSerializer( typeof (Personel));

// XML Verisini tutmak için bir StringReader yaratıyoruz.
StringReader SR = new StringReader(XmlData);
XmlReader XR= new XmlTextReader(SR);

// XML verisinin Deserialize edilip edilmeyeceğini kontrol ediyoruz.
if (MyDeserializer.CanDeserialize(XR))
{
// Ve XML verisini Deserialize ediyoruz.
ReturnedEmployee = (Personel)MyDeserializer.Deserialize(XR);
ShowEmployeeData(ReturnedEmployee);
}
}

// Geri dönüş değerini düzgün bir hale getirmek için kullandığımız metod
private void ShowEmployeeData(Personel PersObject)
{
// Deserializationişlemi yapılmış veriyi tutacak olan formu yaratıyoruz.
ReturnForm ReturnedData = new ReturnForm();

// Veriyi düzgün bir şekilde göstermek için StringiBuilder sınıfı ve
// bu sınıfın Append metodunu kullanıyoruz.
StringBuilder OutputString= new StringBuilder(”Personel Bilgileri: rn”);

OutputString.Append(”Adı: ” + PersObject.Ad + “rn”);
OutputString.Append(”Departmanı: ” + PersObject.Departman + “rn”);
OutputString.Append(”Email: ” + PersObject.Email + “rn”);
OutputString.Append(”Yaşı: ” + PersObject.Yas.ToString() + “rn”);
OutputString.Append(”İşe Başlangıç Tarihi: ” + PersObject.GirisTarihi.ToString() + “rn”);
OutputString.Append(”Maaşı: ” + PersObject.Maas.Tutar + ” ” + PersObject.Maas.Birim + “rn”);

// StringBuilder sınıfımızın Geri dönüş verisini göstereceğimiz form üzerindeki Textbox’ın Text özelliğine atıyoruz ve Formumuzun ShowDialog metodunu kullanarak formumuzu gösteriyoruz.

ReturnedData.txtReturn.Text = OutputString.ToString();
ReturnedData.ShowDialog();
}

Tüm bu kodları yazdıktan ve gerekli olan verileri girdikten sonra önce Serialize daha sonra da Deserialize butonuna bastığımızda karşılığında bize gelecek olan görüntü aşağıdakine benzer bir görüntü olacaktır.

XML Rapor Web Servisleri (XML Report Web Services) 

Bu makalemizde, Crystal Report’ların birer web servisi olarak nasıl yayınlanacaklarını ve istemciler tarafından kullanılacaklarını kısaca incelemeye çalışacağız. Hepimizin bildiği gibi Web Servislerinin günümüz teknolojilerine getirdiği en büyük yenilik, merkezileştirilmiş metodların, herhangibir platformda yer alan sayısız istemci tarafından, hiç bir engele yada kısıtlamaya takılmadan kolayca çağırılabilmeleri ve sonuçların aynı yollar ile kolayca sorunsuz elde edilebilmeleridir. Öyleki, web servislerinin XML tabanlı olarak, SOAP protokolünün belirlediği kriterlerde HTTP gibi basit iletişim protokolleri üzerinden anlaşmayı desteklemesi, onların esnek, genişleyebilir, kolay erişilebilir ve popüler olmalarını sağlamıştır.

İşte web servislerinin sunmuş olduğu bu imkanlardan, geliştirmiş olduğumuz Crsytal Report’larında faydalanmalarını sağlayabiliriz. Çoğunlukla, müşterilerimizin yada firmamız ile birlikte çalışan tedarikçilerimizin, ortak bir noktadan, Crystal Report olarak hazırladığımız esnek ve güçlü raporlara, her platformdan sorunsuz ulaşılabilmeleri amacıyla web servisi tabanlı raporlar geliştirilir.

XML Rapor Web Servislerinin geliştirilmesi iki aşamalı bir işlemden ibarettir. İlk olarak, rapor dosyamızı baz alıcak bir web servisinin geliştirilemesi gerekir. Bu raporu kullanmak için ise, standart bir web servisinin kullanılmasında uygulanan prosedürler işletilir. Yani, web servisine ait referans, uygulamaya eklenir. Sonrasında ise, eğer uygulamayı Visual Studio.Net ile geliştirdiysek, web servisimiz için uygulamamızda bir proxy nesnesi, bu servisin istemci uygulamaya indirilen wsdl dökümanı vasıtasıyla otomatik olarak oluşturulur. Sonrasında, istemci uygulamamız ile web servisimiz arasındaki mesajlaşmalar SOAP protokolünün belirlediği tipte bu proxy nesnesi yardımıyla gerçekleştirilir. Dolayısıyla, geliştireceğimiz istemci uygulamada, bu proxy sınıfına ait nesne örneğini kullanmamız gerekecektir.

Lafı fazla uzatmadan XML Rapor Web Servislerinin geliştirilmesi ile işe başlıyalım. Bu amaçla ilk olarak Visual Studio.Net ortamında bir Asp.Net Web Uygulaması açalım. Bu noktada uygulamamıza, Solution Explorer’dan sağ tıklayarak açtığımız menüden Add Exsiting Item ile daha önceden geliştirmiş olduğumuz herhangibir rpt uzantılı rapor dosyasını ilave edelim. (Bu noktada asıl amacımız rapor dosyasının nasıl oluşturulduğu olmadığı için, bu konunun üstünde fazla durmayacağım. Bu konu ile ilgili olarak değerli editorlerimizden Feryat Olcay’ ın makalelerini takip etmenizi öneririm.)

Ben uygulamamda örnek olarak, daha önceden geliştirdiğim çok basit bir rapor dosyasını kullandım. Bu rapor, Sql Server sunucusunda yer alan Northwind veritabanındaki Customers tablosuna ait bir kaç veriden oluşmakta. Bizim için asıl önemli olan kısım, bu raporun, bir web servisi olarak yayınlanmak istenmesidir. İşte bu amaçla raporumuza sağ tıklıyor ve çıkan menüden Publish As Web Service seçeneğini işaretliyoruz.

Şekil 1: Raporun Web Servisi Olarak Yayınlanması.

Bu işlemin ardından raporumuz için, asmx uzantılı web servisi dosyamızın oluşturulduğunu görürüz.

Şekil 2: Raporumuzun Web Servisi Haline Getirilmesi.

Dilersek bu sayfayı web browser’dan çalıştırarak raporumuz ile ilgili olarak neler yapabileceğimi görebiliriz. Artık elimizde, raporumuzu kullanmak isteyen istemcilere sunabileceğimiz bir web servisimiz var. Son adım olarak uygulamamızı derleyelim. Şimdi bu XML Rapor Web Servisini kullanmak isteyen istemcileri nasıl geliştireceğimize bakalım. Bunun için örnek olarak bir Asp.Net web uygulaması açalım. Bu uygulamaya web servisinden elde edeceğimiz raporu gösterecek olan bir Cyrstal Report Viewer nesnesini ekleyelim. Sayfamız aşağıdakine benzer bir yapıda olabilir.

Şekil 3: İstemci Asp.Net sayfasının tasarım görünümü.

Tanımlanmış olan bir web servisini, bir istemciye eklemek için, Add Web Reference seçeneğini kullanırız. Bu durum, elbetteki XML Rapor Web Servisleri içinde geçerlidir.

Şekil 4. XML Rapor Web Servisinin İstemci Uygulamaya Refernas Edilmesi.

Buradab karşımıza aşağıdaki pencere gelicektir. Biz yerel makinede çalıştığımız ve web servisimizide localhost’umuzda geliştirdiğimiz için, kullanılabilir web servislerini öğrenmek amacıyla getirilen listeden, Web services on the local machine linkini seçebiliriz.

Şekil 5. Kullanılabilir web servislerinin öğrenilmesi.

Bu linki seçtiğimiz takdirde sistemde kullanabileceğimiz web servisleri ekrana gelicektir. Bu servislerden bir taneside, geliştirmiş olduğumuz XML Rapor Web Servisidir. Bu raporu seçerek, web servisine ait referansı uygulamamıza ekleyelim.

Şekil 6. XML Rapor Web Servisimizin Seçilmesi

XML Rapor Web Servisimizin seçilip, istemci uygulamamıza eklenmesi ile birlikte, vs.net bu web servisine ait wsdl dosyasını talep eder. Wsdl dökümanı web servisinin public arayüzünün bir görüntüsünü xml formatında istemci uygulamada kullanabilmemizi sağlar. Bu işlemin ardından, istemci uygulamada XML Rapor Web Servisimize ait Wsdl dökümanıda otomatik olarak oluşturulur. Bu döküman yardımıyla da, web servisimiz ile aramızdaki ilişkiyi nesnesel bazda gerçekleştirebilmemizi sağlayan proxy sınıfımız oluşturulacaktır. Bu durumda Solution Explorer’ da projemizin son halinin aşağıdaki gibi olduğunu görürüz.

Şekil 7. Proxy Sınıfımız Oluşturulur.

Artık tek yapmamız gereken, XML Rapor Web Servisimizden elde edeceğimiz raporun içeriğini, Crystal Report Viewer nesnemizde göstermek. Bunun için aşağıdaki basit kod satırlarını uygulamamıza eklememiz yeterli olucaktır.

private void btnRaporla_Click(object sender, System.EventArgs e)
{
/* Öncelikle proxy sınıfımıza ait bir nesne örneğini oluşturuyoruz. */
localhost.MusteriRaporlariService rapor=new RaporIstemci.localhost.MusteriRaporlariService();
this.CrystalReportViewer1.ReportSource=rapor; // Web sayfamızdaki CrystalReportViewer nesnemize rapor kaynağı olarak, proxy nesnemizi atıyoruz. */
this.CrystalReportViewer1.DataBind(); /* Nesnemizi gelen rapor verilerine bağlıyoruz.*/
}

Burada olanları kısaca özetlemek gerekirse; öncelikle XML Rapor Web Servisimizin istemci uygulama için oluşturulan proxy sınıfından bir nesne örnekledik. Böylece, istemcimizdeki Crystal Rapor nesnemiz, bu proxy sınıfından elde edilen verileri gösterecek. Elbetteki proxy nesnemizde bu verileri, XML Rapor Web Servisimizden almakta. Web sayfamızı çalıştırıp, buton kontrolümüze tıkladığımızda aşağıdakine benzer bir sayfa ile karşılaşırız.

Şekil 8. Raporun Elde Edilmesi.

Bu makalemizde en basit haliyle, XML Rapor Web Servislerinin nasıl oluşturulduğunu ve kullanıldığını incelemeye çalıştık. Görüldüğü gibi kilit nokta, raporun web servisi olarak yayınlanmasıdır. (Publish As Web Service) Diğer taraftan geri kalan bütün işlemler web servislerinin istemcilerde kullanılmasındaki teknikler ile aynıdır.

XML Serileştirme Nitelikleri (Serialization Attribute) 

Bu yazıda serileştirme işleminde kullanılan niteliklerden bahsedeceğim. Bir önceki bölümde sizlere .NET Framework’te XMLSerialization işleminin nasıl yapıldığından bahsetmiştim. İlk bölümü okuyan arkadaşların hatırlayacağı gibi XMLSerialization işleminde nesnemiz(object) içinde public tanımlı özellik (property) ve alanları (field) serileştirebiliyorduk(serialize). Ama serileştirme işleminin sonucunda aşağıda yazdıklarım serileştirilmiş nesnenin kullanılacağı başka bir uygulamada problem yaratabilmekte veya serileştirilip XML haline getirilmiş olan nesnemizin okunabilirliğinin azalmasına neden olabilmektedir.

     

  • Tüm public özellik(property) ve alanlar(field) serileştirilir(serialize), ama biz nesnemizde bulunan tüm public özellik ve alanları serileştirmek istemeyebiliriz.
  • Serileştirdiğimiz özellik ve alanların nesne içindeki isimlendirmeleri kullanılır.
  • Aynı şekilde Root eleman adı olarak nesnemizin adı kullanılır.

Bu tür problemleri çözmek ve serileştirilmiş nesneyi kişiselleştirebilmek ve okunabilirliğini artırmak içinse System.Xml.Serialization namespace’inin bize sağlamış olduğu Serileştirme niteliklerini(Serialization attribute) kullanırız.


Serileştirme nitelikleri(Serialization attribute);

     

  • Serialize ettiğimiz veriyi XML child eleman yerine XML attribute tanımlamak için,
  • Bir XML eleman veya attribute’unun adını değiştirmek için,
  • Bir XML eleman veya attribute’unun XSD veritipini değiştirmek için,
  • XML eleman veya attribute’unun namespace’sini değiştirmek için,
  • Bir alan veya özelliği serialization işleminden çıkarmak için,

kullanılır. En çok kullanılan serileştirme niteliklerini aşağıdaki tabloda bulabilirsiniz.

Attribute Adı

Özellikler

Uygulama Alanı

Açıklama

XmlAttribute AttributeName,
DataType,
Namespace
Public Alan(Field),
Özellik(Property)
XML Attribute olarak serialize edeceğimiz alan veya özelliklerde kullanılır.
XmlElement ElementName,
DataType,
Namespace
Public Alan(Field),
Özellik(Property)
XML Element olarak serialize edeceğimiz alan veya özelliklerde kullanılır.
XMlIgnore

-

Public Alan(Field),
Özellik(Property)
Serialize etmek istediğimiz alan ve özellikleride kullanılır.
XmlRoot ElementName,
DataType,
Namespace
Public Sınıf(Class) Root eleman adını değiştirmek için kullanılır.
XmlText DataType Public Alan(Field),
Özellik(Property)
Sadece text olarak serialize edeceğimiz alan veya özelliklerde kullanılır.

Tüm nitelik(attribute) adları sonunda “Attribute” kelimesi içerir. Örneğin XmlAttribute ile XmlAttributeAttribute aynı anlamdadır ve kodumuz içinde her ikisinide kullanabiliriz.

İsterseniz bu anlattıklarımı örnek üzerinde kullanalım.

Örneğimiz için ilk bölümde oluşturduğumuz Personel ve Para sınıflarını kullanacak ve aşağıda yazılı değişiklikleri yapacağız.

     

  1. Root elemanın adını “Personel Bilgi” olarak değiştirecek
  2. Namespace’simize “urn:CSharpNedir” ekleyecek
  3. Departman alanı serialization işleminde değerlendirilmeyecek
  4. Email alan adı MailAdresi olarak gözükecek
  5. GirisTarihi alanının XSD veritipini “date” olarak belirlenecek.
  6. Para sınıfında Birim alanı Maas alanının niteliği(attribute) olarak gözükecek

Bu işlemleri gerçekleştirmek için Personel ve Para sınıflarımıza önce aşağıda yazılı kodu kullanarak System.Xml.Serialization Namespace’ini import ediyoruz.

using System.Xml.Serialization;

     

  1. Namespace’imizi import ettikten sonra 1 ve 2 nolu işlemleri gerçekleştirmek için XmlRoot niteliğinin(attribute) “Namespace” ve “ElementName” özelliklerini kullanıyoruz.
  2. 3 nolu işlemi gerçekleştirmek için XmlIgnore niteliğini(attribute) kullanıyoruz.
  3. 4 nolu işlemi gerçekleştirmek için XmlElement niteliğinin(attribute) “ElementName” özelliğini kullanıyoruz.
  4. 5 nolu işlemi gerçekleştirmek için XmlElement niteliğinin(attribute) “DataType” özelliğini kullanıyoruz.
  5. 6 nolu işlemi gerçekleştirmek için XmlAttribute niteliğinin(attribute) “AttributeName” özelliğini kullanıyoruz.

Tüm bu işlemleri gerçekleştirdikten sonra Personel ve Para sınıflarımız görünümü aşağıdaki gibi olacaktır.

using System;
using System.Xml.Serialization;namespace PersonelBilgi
{
/*
Serileştirdiğimiz nesnenin Namespace’ine “urn:CSharpNedir” ekliyor ve Root eleman adını “PersonelBilgi” olarak değiştiriyoruz.(1 ve 2 nolu işlemler)
*/ < br> [XmlRoot(Namespace=”urn:CSharpNedir”,ElementName=”PersonelBilgi”)]
public class Personel
{
public stringAd;
[XmlIgnore()]//Departman alanını Serialize etmiyoruz.(3 nolu işlem)
public stringDepartman;
[XmlElement(ElementName=”MailAdresi”)]//Email alan adını “MailAdresi” olarak değiştiriyoruz.(4 nolu işlem)
public string Email;
public int Yas;
public Para Maas;
[XmlElement(DataType=”date”)]//Giris Tarihi alanının veritipini XSD “date” veritipine çeviriyoruz.(5 nolu işlem)
public DateTime GirisTarihi;
}//Personel sınıfı sonu

 

public class Para
{
[XmlAttribute(AttributeName=”ParaBirimi”)]//Birim alanını attribute olarak tanımlıyoruz.(6 nolu işlem)
public string Birim;
public decimal Tutar;
}//Para sınıfı sonu
}//Namespace sonu

Formumuz üzerinde herhangi bir değişiklik yapmıyoruz. Gerekli değişiklikleri yapıp uygulamamızı çalıştırdıktan sonra gerekli verileri girip Serialize butonuna bastığımızda alacağımız çıktı aşağıdaki gibi olacaktır.

Deserialize butonuna bastığımızda ise alacağımız çıktıda da göreceğimiz gibi departman alanı boş olarak karşımıza çıkacaktır. Bunun nedeni ise Departman alanını XmlIgnore attribute’u kullanarak serialize işlemine tutmamamızdır.

SOAP Header Kullanarak Web Servislerine Kimlik Denetimi Eklemek 

Web Servis teknolojisi platformları, mesafeleri, dilleri ve kültürleri aşarak bazı hizmetleri paylaşabilmek amacıyla geliştirilmiştir. Bazen geliştirdiğimiz bu servisler içerik olarak hassas ve önemli bilgiler taşıyabilir ve bu servisleri ancak belirli kişilerin kullanmasına izin verilebilir. İşte bir Web Servis hizmetinin, imtiyaz sahibi belirli kişiler tarafından kullanılmasını sağlamanın en pratik yolu Kimlik Denetimi yapmaktır.

Bir Web Servis uygulamasında kimlik denetimi SOAP Headers aracılığıyla yapılır. Bu çalışmada üç temel adımımız var:

Birincisi; bir web servisi hazırlamak,
İkincisi; web servisimize kimlik denetimi eklemek,
Üçüncüsü; kimlik denetimli bir web servisini kullanmak.

1. Bir Web Servisi Hazırlamak

Öncelikle web servisi projemizi başlatalım. Bunun için Visul studio.Net te yeni projeler menüsünden proje tipi olarak C# ve Şablon olarak da Web Service seçelim ve proje adını “KimikDenetimliWebServis” olarak tanımlayalım.

Visual Studio bize uygulamamız için gerekli bileşenlerle donatılmış bir proje oluşturur. Bu bileşenlerden biri de Web Servis dosyası olan “Service1.asmx” dir. İsimlendirme için bir çok satır kodu değiştirmekle uğraşmamak için bu dosyayı siliyoruz ve Project menüsünden Add Web Service… seçeneğini tıklayıp uygulamıza BasitAraclar isimli yeni bir Web Service dosyası ekliyoruz.

Evet şimdi projemiz içerisinde “BasitAraclar.asmx” dosyasıyla hazır. Dosyayı kod penceresinde açarak kodumuzu yazmaya başlayabiliriz. Odak noktamız kimlik denetimi olacağından basit bir web metodu yazacağız.


[WebMethod]
public int SayiUret(int altLimit, int ustLimit)
{
Random rastgele=new Random();
return rastgele.Next(altLimit, ustLimit);
}

Metodumuz kendisine verilen altLimit ile ustLimit tamsayıları arasında rastgele bir sayı üreterek bunu çağırıldığı noktaya iletiyor. Kodumuzu hemen test edelim. Ancak çalıştırmadan önce uygulamanın başlangıç noktası olarak web servisimizi tanımlamalıyız. Solution Explorer da BasitAraclar.asmx üzerine sağ tıklayalım ve Set As Start Page diyelim. Şimdi F5 e basarak uygulamamızı çalıştırabiliriz.

BasitAraclar web servisimiz için ekrana gelecek olan web sayfasında bulunan SayiUret linkine tıklayalım. Açılan sayfada metodumuzu denemek amacıyla alt ve üst limitleri girelim ve invoke butonuna basalım.

Butona her tıkladığımızda alt limitle üst limit arasında değişen rastgele üretilmiş sayılar sonuç sayfasıyla bize gönderilecektir.

Şimdi servisimize bu iki int parametreyi, yani altLimit ve ustLimit sayılarını taşıyan mekanizmaya bir bakalım. Web servisleri veri alış verişinde SOAP (Simple Object Access Protocol) kullanırlar. SOAP sayesinde veri platform bağımsız olarak ve güvenlik duvarlarınca engellenmeden her türlü ortama aktarılabilir. Burada konumuz SOAP olmadığından SOAP mesajına genel olarak bir bakmamız yeterli. İki int parametre alan metodun tanımlanışı açıkça belli oluyor.

<?xml version=”1.0″ encoding=”utf-8″?>
<soap:Envelope xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xmlns:xsd=”http://www.w3.org/2001/XMLSchema” xmlns:soap=”http://schemas.xmlsoap.org/soap/envelope/”>
<soap:Body>
<SayiUret xmlns=”http://tempuri.org/”>
<altLimit>int</altLimit>
<ustLimit>int</ustLimit>
</SayiUret>
</soap:Body>
</soap:Envelope>

Basit bir web servisi hazırladık ve testimizi de yaptık. En son SOAP yapısını da inceleyince birinci aşamayı tamamlamış olduk.

2. Web Servisine Kimlik Denetimi Eklemek

Şimdi de servisimize kimlik denetimi ekleyelim. Bu işlemi basitçe ve adımlar şeklinde gerçekleştireceğiz.

Birinci adım, aşağıdaki isim alanını uygulamamıza ekeleyelim.

using System.Web.Services.Protocols;

İkinci adım, AuthHeader adında SoapHeader classından miras alma yoluyla türetilmiş yeni bir sınıf oluşturalım.


// Kimlik denetimi için kullanılacak sınıf.

public class AuthHeader : SoapHeader
{
public string Username;
public string Password;
}

Sınıfımız iki public üyeye sahip. Bunlar string veri tipinde. Bu üyelerin amacı kullanıcıadı ve parola bilgilerini taşıyarak kimlik denetiminde kullanılmalarını sağlamak.

Üçüncü adım, kimlik denetimi bilgilerini web servis uygulaması içinde kullanılabilir hale getirmek için, BasitAraclar sınıfı içerisinde, tasarladığımız AuthHeader veri tipinde public bir field tanımlamak.

public AuthHeader KimlikDenetimi;

Dördüncü adım, kimlik denetimi yapmak istediğimiz servise bir attribute eklemek.

[SoapHeader(”KimlikDenetimi”)]

Beşinci adım, web servis uygulamamızda tanımladığımız ve SoapHeader attribute içerisinde referans gösterdiğimiz KimlikDenetim isimli değişkeni kullanarak kod içerisinde denetimimizi gerçekleştirelim.

if(KimlikDenetimi.Username==”test” &&
KimlikDenetimi.Password==”test”)
{
// Kimlik denetimi: kullanıcı sistemde tanımlı
Random rastgele=new Random();
return rastgele.Next(altLimit, ustLimit);
}
else
// Kimlik denetimi: kullanıcı yetkisiz
return 0;

Evet buraya kadar olan işlemlerle, kimlik denetimi kullanan bir web servis uygulaması geliştirmiş olduk. Sizin de tahmin edebileceğiniz gibi bu uygulamanın çalıştırılması denetimsiz bir web servisi uygulamasından farklı olacaktır. Bunun için kullanıcı kimlik bilgilerinin SOAP Header� a yüklenerek web servisine gönderilmesi gerekir. Şimdi F5 tuşuna basarak uygulamamızı çalıştıralım ve yeni SOAP tanımımıza bir göz atalım.

<?xml version=”1.0″ encoding=”utf-8″?>
<soap:Envelope xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xmlns:xsd=”http://www.w3.org/2001/XMLSchema
xmlns:soap=”http://schemas.xmlsoap.org/soap/envelope/”>
<soap:Header>
<AuthHeader xmlns=”http://tempuri.org/”>
<Username>string</Username>
<Password>string</Password>
</AuthHeader>
</soap:Header>

<soap:Body>
<SayiUret xmlns=”http://tempuri.org/”>
<altLimit>int</altLimit>
<ustLimit>int</ustLimit>
</SayiUret>
</soap:Body>
</soap:Envelope>

Açıkça görüleceği üzere SOAP tanımımıza yeni bir bölüm eklenmiş: HEADER. Güvenlik bilgisi BODY bölümü içerisinde değil HEADER bölümü içerisinde taşınmaktadır. Uygulamayı çalıştırmayı denediyseniz hata sayfasıyla karşılaşmışsınızdır. Bu kaçınılmazdır. Çünkü web servisi yardım sayfasıyla HEADER oluşturmanız mümkün değildir. Şimdi yapmamız gereken kimlik denetimi için gerekli SOAP ı yapılandırabilecek bir uygulama geliştirmek.

3. Kimlik Denetimli Bir Web Servisini Kullanmak

Basit ve hızlı olması nedeniyle “Console” uygulamasını kullanacağız. Öncelikle yeni bir Visual Studio.Net Console Projesi başlatalım ve adını KimlikDenetimliWSTesti diyelim. Hemen arkasından uygulamamıza nir referans ekleyelim.

Add Web Reference.. seçeneğiyle birlikte Web Servisiniyle ilgili bilginin nereden alınacağını tanımlamamızın gerektiği bir ekranla karşılaşacağız. Burada Web services on the local machine seçeneğini kullanarak geliştirdiğimiz örneği bulalım.

Web referans adı olarak DenetimliServis yazalım ve Add Reference butonuna basarak, uygulamamıza referansı ekleyelim.

Şimdi test kodumuzu yazabiliriz. Konsol ekranında kullanıcı ilk olarak alt limit ve üst limit bilgilerini girmesi gerektiği mesajıyla karşılanacak. Kullanıcı alt ve üst limitleri girip Enter a bastığında ilk rastgele sayı üretilecek ve ekrana yazdırılacak. Kullanıcı belirlediği aralıkta başka rastgele sayı üretmek isterse Enter, uygulamadan çıkmak isterse H tuşuna basacak.

Gelelim uygulamadaki en hassa noktaya. Kimlik denetimi için kullanıcı bilgilerinin girileceği nokta… Metod çağırılmadan hemen önce kullanıcı bilgileri tanımlanır ve metodu çağıracak nesneye yüklenir. Gelin koda bir bakalım.
// Metodu çalıştıracak nesne…
DenetimliServis.BasitAraclar arac=new DenetimliServis.BasitAraclar();

 

// Kimlik bilgilerini taşıyacak nesne
DenetimliServis.AuthHeader header=new DenetimliServis.AuthHeader();

//Kimlik bilgileri yükleniyor.
header.Username=”test”;
header.Password=”test”;

//Güvenlik bilgileri metodu çalıştıracak nesneye yükleniyor.
arac.AuthHeaderValue=header;

DenetimliServis isim alanı web servisimizi temsil ediyor. Web servisimizin referansını eklediğimiz anda Visual Studio WSDL dokümanına bakarak iki sınıfı uygulamızda kullanabilmemiz için proxy olarak bizim için yapılandırdı: BasitAraclar ve AuthHeader. Basit araçlar rastgele sayıyı üreten metodu içinde barındıran sınıf. AuthHeader ise kimlik denetimi için gerekli bilgileri taşıyacak olan sınıf. Bu iki sınıf, metod çağırılmadan hemen önce bir yerde buluşmak zorunda.

BasitAraclar sınıfının bir örneği olan arac nesnesinin SayiUret metodu çağırılmadan önce, aac nesnesine kimlik bilgileri yüklenmeli. Bunu gerçekleştirmek için, arac nesnesinin AuthHeaderValue propertisine kimlik bilgilerini yüklediğimiz header nesnesini yüklüyoruz. Böylece kimlik denetimli bir şekilde metodumuzu rahatlıkla çağırabiliriz.

int sayi=arac.SayiUret(altLimit,ustLimit);

XML ile İnternette İletişim 

XML Dosyalarini istemci tarafina bir kaç yol ile alabilirsiniz. Bu makalemizde bu islemi XMLTextReader nesnesi ile yapacağız.
XMLTextReader genel özelliklerine bakacak olursak: XMLTextReader, XML Dosyalarini sadece ileri yönde ve sadece okuma amaçlı olarak almaktadır. Islem gerçekleşirken olusan hatalarda XMLException sınıfıdan bir hata yakalar fakat bu kodun çalismasini durdurmaz. fırlatmış olduğu bu hatadan hatanın oluştuğu satırı yakalayabiliriz.
XMLTextReader Sadece Dosyanın yolunu parametre olarak almaktadir. Biz burada parametre olarak yukarıda saydığımız internet yolu gibi fiziksel yol da gösterebiliriz.

Kodumuzu yazmaya baslamadan XML Sınıfını projemize eklememiz gerekiyor.

using System.XML;

Ardindan kodumuzu yazmaya başlayabiliriz.

XmlTextReader xtrRss = new XmlTextReader(”http://www.csharpnedir.com/rss.xml”);

Yukaridaki kod ile CSharpNedir?�e ait olan ve sitedeki makaleler hakkında bilgiler veren XML dosyasını kendi tarafımıza çekmiş olduk.
XMLTextreader nesnesinin bize sagladigi bu verileri bir dataSet nesnesine ReadXml Metoduyla ekleyebiliriz.

DataSet dsRss= new DataSet();

Yeni datasetimizi tanimladik.

dsRss.ReadXml(xtrRss);

ReadXml metoduna parametre olarak XMLTextReader nesnesini gönderiyoruz. Parametre olarak ayrica String, Stream,XMLReader ve TextReader gönderebiliriz.
CSharpNedir?�e ait olan bu XML dosyasini dataSet içine aldığımız zaman üç tane tablo olustuğunu görüyoruz.
İlk tabloda RSS dosyasinin versiyonu, ikinci tabloda Sitemizin adresi ve Üçüncü tabloda ise konu başlıkları yer almaktadir.
DataSetimizi bir Datagrid�e veri kaynağı olarak gösterip elde ettiğimiz bu verileri datagrid içinde görüntüleyebiliriz.

dataGrid1.DataSource=dsRss.Tables[2] ;

Tablo numarası elinizde bulunan veriye göre değişebilir. RSSleri baz aldığımızda konu başlıkları 3. Tabloda bulunduğu için örneğimizde dsRss.Tables[2] tablosunu kullandık.

Peki bu XML dosyasinin verilerini aldık ama şemasını alabilirmiyiz?
Hemen bunun denemesini birlikte yapalim:

dsRss.WriteXmlSchema(”sema.xsd”);

WriteXmlSchema metoduyla Xml dosyasının şemasını fiziksel olarak elde etmis olduk. Projenin bulundugu klasöre baktigimizda sema.xsd dosyasini göruyoruz. Visual Studio bize sema.xsd dosyasini bir veritabani gibi grafiksel bir arayüz ile görmemizi saglamaktadir. Bu sayede CSharpNedir?com�a ait XML dosyasinin şemasını görüyoruz.


CSharpNedir?com�a ait XML dosyasının Şeması

Borland C#Builder yardimiyla hazirladığım örnek Borland Projesi dosyalarını aşağıda bulunan linkten indirebilirsiniz. Burada gördüğünüz kod parçalarını ise SharpDevelop programı yardımıyla hazırladım.


Sharpdevelop programı arayüzü alışık olduğumuz bir formatta.

using System;
using System.Windows.Forms;
using System.Data;
using System.Xml;

void MainFormLoad(object sender, System.EventArgs e)
{
///Bu kodlarda tüm işlemleri formun load olayına koyduk
///Örnek Borland projemizde ise bunları biraz daha
/// düzenli hale getirmeye çalıştık.
XmlTextReader xtrRss = new XmlTextReader(”http://www.csharpnedir.com/rss.xml”);
DataSet dsRss= new DataSet();
dsRss.ReadXml(xtrRss);
dataGrid1.DataSource=dsRss.Tables[2] ;
dsRss.WriteXmlSchema(”sema.xsd”);
}

XML Web Servisleri - 1 

Bir Web Servisi, uzak istemcilerin başvuruda bulunduğu çeşitli işlevsel metod çağırımlarını bardındırdan, çok yönlü ve merkezileştirilmiş bir ünitedir. Bir web servisi, çok sayıda istemci tarafından erişilebilen bir yapıya sahiptir. Onu diğer dağıtık nesne modellerinden farklı kılan sahip olduğu alt yapı sistemi sayesinde, platform bağımsız uygulanabilirliği sağlamasıdır. Web servislerinin geliştirilmesinde en büyük etken, özellikle bir merkezdeki uygulamalar üzerinde, ortak amaçları gerçekleştiren işlevselliklere sahip nesnelerin, geliştirildikleri ağın iletişim protokolü gibi kısıtlamaların varlığıdır.

Bir web servisi, standart olarak HTML iletişim protokolü üzerinden veri alışverişine izin veren bir yapıdadır. HTML tabanlı bu sistemin bilgi otobanı XML temelleri üzerine dayandırılmıştır. XML� in bizlere sağladığı esneklik, kolay geliştirilebilirlik özelliklerinin yanı sıra, sağlamış olduğu global standartlar, platform bağımsız veri transferi kavramını dahada geliştirmiştir. Web servislerinin kullanılmasında yatan en büyük kavram xml tabanlı veri akışının belirli standartlar dahilinde gerçekleştirilmesidir. Bu, web servislerinin platform bağımsız olarak herhangibir ateş duvarına (Firewall) yakalanmadan istemciler ile haberleşebilmesini sağlar.

Şekil 1. XML Web Servisleri Neyi İfade Eder?

Bir web servisi, tek başına bir anlam ifade etmez. Web servisini kullanan istemcilerin de olması gerekir. İstemciler internet ortamında olabileceği gibi, çalıştığımız şirketin network sisteminde yada evimizdeki makinenin yerel sunucusu üzerinde olabilir. Bir istemci, bir web servisini kullanmak istediğinde tek yapması gereken, bu web servisi ile konuşabilecek ortak bir takım standartları uygulamaktır. XML tabanlı bu standartlar sayesinde istemciler, web servisine ulaşabilir, bu servis üzerinden metodlar çağırabilir, bu metodlara parametreler gönderebilir ve metodlardan dönen değerleri örneğin veri kümelerini elde edebilir.

Web servislerinin kullanımına verilebilecek en güzel örnek, hava durumuna ilişkin bilgilerinin en güncel halleriyle, çeşitli platformlarda çalışan istemcilere sunulduğu bir sistem olabilir. Hava durumuna ilişkin çeşitli bilgileri bir veri kümesi halinde tedarik eden merkezi web servisine istemciler, bir web sayfasından, bir windows yada java uygulmasından, bir mobil uygulamadan veya başka bir platformdan kolayca erişebilir. Web servisleri merkezi uygulamalar olduklarından, verilerdeki değişiklikler bu servisleri kullanan tüm uygulamalar için de eş zamanlı ve eş güncellikte olacaktır. Web servisleri ve bu servisleri kullanan istemciler arasındaki ilişkiler, yüzeysel olarak bakıldığında aşağıdaki şekilde görüldüğü gibi değerlendirilebilir.

Şekil 2. En basit haliyle Xml Web Servislerinin hayatımızdaki yeri.

Web servislerinin, onları kullanan istemciler ile arasındaki ilişki, şüphesiz ki bu şekilde göründüğü kadar basit değildir. Herşeyden önce, web servislerini kullanacak istemciler ile arada kurulucak ilişkinin belli standartlara dayandırılması gerekir. Her ne kadar, web servisleri HTML üzerinden gidecek XML veri parçalarını kullanıyor olsada bunların, istemcilerin işleyebileceği ve anlayabileceği bir hale getirilmeleri gerekir. Bu noktada devreye Web Servisleri için önemli ve gerekli temellerden birisi olan SOAP (Simple Object Access Protocol - Basit Nesne Erişim Antlaşması ) girer.

Bir istemci, kullanacağı web servisine ait bir takım bilgilere sahip olmak zorundadır. İstemci bu bilgileri kullanarak web servisinden SOAP protokolüne uygun olarak hazırlanan XML mesajını gönderir. Kodlanarak (Encoding) gönderilen bu mesaj, Web Servisi tarafından çözülür (Decoding) , gerekli parametreler ve metod çağırım bilgileri eşliğinde bir takım işlemler gerçekleştirir. Bu işlemler sonrasında Web Servisi, istemciye döndüreceği cevap bilgileri için yine SOAP protokolüne uygun XML mesajlarını oluşturur. Bu mesajlar HTTP üzerinden istemci uygulamaya ulaşır, burada çözülür ve değerlendirilir.

Elbette şekildeki senaryoda yer alan istemci sistemler bunlar ile sınırılı değildir. Çok çeşitli platformlar da web servislerini kullanabilir. Web servisinin önünde çalışan bir Firewall (Ateş Duvarı) olması bilgilerin kolayca taşınabilmesini engellemez. Çünkü mesajlar, istemciler ve web servisleri arasında XML tabanlı bilgi parçacıkları şeklinde taşınmaktadır.

İstemcilerin kullanacakları web servisindeki bilgileri önceden bilmeleri gerekir. WSDL (Web Services Description Language - Web Servisleri Tanımlama Dili ) bu noktada devreye giren bir diğer önemli unsurdur. İstemci uygulamalar WSDL yardımıyla, kullanacakları web servisine ait bilgileri önceden tedarik ederler. Bu istemcinin web servisi üzerindeki bir web metodunun varlığından haberdar olması, onu nasıl kullanacağını bilmesi anlamına gelmektedir. Web servislerinin mimarisini daha derin ve detaylı bir şekilde incelemeden önce, ilk Web Servisi uygulamamızı yazmaya başlıyoruz.

Bir Web Servisini oluşturmak için, Notepad gibi basit bir metin editorunu kullanabileceğimiz gibi, Visual Studio.NET gibi ileri seviyede bir yazılım geliştirme platformunuda kullanabiliriz. İlk önce Notepad üzerinden bir web servisinin nasıl yazılacağını göreceğiz. Bir web servisi her şeyden önce, intranet veya internet üzerinde yer alan bir sunucuda konuşlandırılmalıdır. Yerel bir makinede bu iş için, IIS (Internet Information Services) kullanılabilir. Bu nedenle ilk olarak, web servisimizi barındırıcak sanal bir klasör oluşturmakla işe başlamalıyız. Windows XP işletim sistemine sahip bir bilgisayarda, IIS altında sanal klasörümüzü oluşturabilmek için Start menüsü, Administrative Tool, Internet Informatin Services kısmına girelim.

Şekil 3. IIS

Ardından Default Web Site (yada web sunucusunun adı) kısmında sağ menü tuşuna basıp New kısmından Virtual Directory� yi seçelim.

Şekil 4. Virtual Directory.

Karışımıza çıkacak olan sihirbazda Alias kısmına Geometri girelim. Klasörümüzü ise, C:InetpubwwwrootGeometri olarak oluşturalım. Buradaki adımları tamamladıktan sonra, web servisimizi bu klasör altında oluşturabiliriz. Web servisleri, asmx uzantılı dosyalar olarak oluşturulurlar. Bu nedenle, asmx uzantılı dosyamızı, yerel web sunucumuzda oluşturduğumuz sanal klasörün işaret ettiği fiziki klasörde aşağıdaki kodlar ile hazırlayalım.

<% @ WebService Language=”C#” CodeBehind=”GeoMat.asmx.cs” class=”GeoWebServis.TemelIsler” %>

Hazırladığımız bu dosyayı, GeoMat.asmx uzantısı ile kaydedelim. Kodlarda görüldüğü gibi, web servisimizin asıl işlevselliğini, GeoMat.asmx.cs isimli Code-Behind dosyasında gerçekleştireceğiz. Burada kullanacağımız programlama dilinide Language özelliğine C# değerini atayarak belirledik. Ancak en önemlisi kaydedilen bu asmx dosyasının bir web servisi olarak değerlendirileceğini belirten WebService anahtar sözcüğünün kullanılmasıdır. Şimdi Code-Behind dosyamızı oluşturalım.

using System;
using System.Web;
using System.Web.Services;

 

namespace GeoWebServis
{

[WebService(Namespace=”http://ilk/servis/”,Description=”Geometrik Hesaplamalar Üzerine Metodlar İçerir. Ucgen, Dortgen gibi şekillere yönelik alan ve çevre hesaplamaları.”,Name=”Geometrik Hesaplamalar”)]
public class TemelIsler : System.Web.Services.WebService
{
private const double pi=3.14;

[WebMethod(Description=”Daire Alan Hesabı Yapar”)]
public double DaireAlan( double r)
{
return (r*r)*pi;
}

[WebMethod(Description=”Daire Çevre Hesabı Yapar.”)]
public double DaireCevre( double r)
{
return 2*pi*r;
}
}
}

Yazdığımız bu dosyayı GeoMat.asmx.cs ismi ile asmx dosyamızın bulunduğu klasöre kayıt edelim. Kodları kısaca incelediğimizde ilk olarak, köşeli parantezler içerisindeki ifadeler dikkatimizi çekmektedir. Bu ifadeler birer nitelik (attribute) olup, web servisindeki sınıf ve metodlara ilişkin bir takım bilgileri, bu servisi kullanacak olan istemcilere sağlarlar.

Örneğin WebService niteliğinde, Namespace özelliği ile, bu servisin tanımını içerecek XML dökümanında kullanılacak Namespace� i belirtmiş oluruz. Description özelliği ile, web servisindeki bu sınıfın neler yaptığını özetleyen kısa bilgileri belirleriz. Name özelliği ilede, bu sınıfa bir isim vermiş oluruz. Bu bilgiler özellikle web servisini keşfettiğimizde (Discovery) , oldukça işe yaramaktadır. WebService niteliğine benzer olarak WebMethod niteliği, izleyen metodun bir web servisi metodu olduğunu belirtmek için kullanılır. Burada iki web servisi metodumuz yer almaktadır. Her birinin ne iş yaptığına dair kısa bilgileride WebMethod niteliğinin Description özelliği ile belirtebiliriz.

Burada kullandığımız isim alanı ve sınıf adlarının, asmx dosyasında belirtiğimiz class tanımlamalarındaki ile aynı olduğuna dikkat edelim. Bir web servisi yazdığımızda, bu web servisini oluşturacak olan sınıfın, System.Web.Services.WebService isim alanından türetilmesi gerekir. Yazmış olduğumuz bu web servisi temel olarak iki metoda sahiptir ve bu metodların herbiri double türünden birer parametre alarak, yine double türünden sonuçlar üretmekte ve metodun çağırıldığı yere döndürmektedirler. Burada kullanılan parametreler istemci bilgisayarların, web servisindeki ilgili metodları çağırımları sırasında kullanılır. Dönüş değerleri ise, ilgili metodları çağıran istemcilere gönderilir.

Web servisimize ait asmx dosyamızı ve Code-Behind dosyamızı oluşturduktan sonra, Code-Behind dosyamızı dll kütüphanesi olarak derleyip, bin isimli bir klasör içerisine koymalıyız. Bu amaçla komut satırından aşağıdaki komutu vererek, Code-Behind dosyamızı bir sınıf kütüphanesi olacak şekilde csc yardımıyla derliyoruz.

csc /target:library GeoMat.asmx.cs

Oluşturulan dll dosyasını asmx dosyamızın blunduğu klasör altındaki bin isimli bir klasör içerisine taşıdıktan sonra web servisimize herhangibir tarayıcıdan rahatlıkla erişebiliriz. Bunun için, Internet Explorer penceresinde adres satırına

http://localhost/Geometri/GeoMat.asmx

url bilgisini yazmamız yeterli olucaktır. Bu işlem sonrasında web servisimizin çalışır hali aşağıdaki gibi olacaktır.

Şekil 5. Xml Web Servisinin tarayıcıdan talep edilmesinin sonucu.

Görüldüğü gibi asmx uzantılı dosyamızı kullanarak, geliştirmiş olduğumuz web servisine ait bilgilere eriştik. Burada yazılan bilgilerin, WebService ve WebMethod niteliklerinde belirtmiş olduğumuz değerlerin aynısı olduğu dikkatinizi çekmiştir. Dilersek bu pencerede servisimizi deniyebiliriz. Web servisimizde geliştirdiğimiz metodlara ait linklerden hernangibirisine tıkladığımızda, bu metodu çağırmamız için kullanabileceğimiz bir sayfa ile karşılaşırız.

Şekil 6. Bir Web Metodunun çağırılması.

Bu ekranda, value ile belirtilen bir metin kutusu olduğuna dikkat edin. Bu metin kutusu metodumuzun dışarıdan aldığı double tipten parametreye istinaden oluşturulmuştur. Buraya bir değer girerek metodun çağırılmasını sağlayabiliriz. Bu durumda metodun çalıştırılması sonucu elde edilecek sonuç(lar) bir XML bilgisi şeklinde elde edilecek ve tarayıcı penceresinde aşağıda olduğu gibi görünecektir.

Web servisimizin ana sayfasında Service Description isimli bir bağlantı vardır. Bu bağlantıya tıkladığımızda aşağıdaki gibi uzun bir XML bilgisi elde ederiz.

<?xml version=”1.0″ encoding=”utf-8″ ?> - <definitions xmlns:http=”http://schemas.xmlsoap.org/wsdl/http/” xmlns:soap=”http://schemas.xmlsoap.org/wsdl/soap/” xmlns:s=”http://www.w3.org/2001/XMLSchema” xmlns:s0=”http://ilk/servis/” xmlns:soapenc=”http://schemas.xmlsoap.org/soap/encoding/” xmlns:tm=”http://microsoft.com/wsdl/mime/textMatching/” xmlns:mime=”http://schemas.xmlsoap.org/wsdl/mime/” targetNamespace=”http://ilk/servis/” xmlns=”http://schemas.xmlsoap.org/wsdl/“> - <types> - <s:schema elementFormDefault=”qualified” targetNamespace=”http://ilk/servis/“> - <s:element name=”DaireAlan“> - <s:complexType> - <s:sequence> <s:element minOccurs=”1” maxOccurs=”1” name=”r” type=”s:double” /> </s:sequence> </s:complexType> </s:element> - <s:element name=”DaireAlanResponse“> - <s:complexType> - <s:sequence> <s:element minOccurs=”1” maxOccurs=”1” name=”DaireAlanResult” type=”s:double” /> </s:sequence> </s:complexType> </s:element> - <s:element name=”DaireCevre“> - <s:complexType> - <s:sequence> <s:element minOccurs=”1” maxOccurs=”1” name=”r” type=”s:double” /> </s:sequence> </s:complexType> </s:element> - <s:element name=”DaireCevreResponse“> - <s:complexType> - <s:sequence> <s:element minOccurs=”1” maxOccurs=”1” name=”DaireCevreResult” type=”s:double” /> </s:sequence> </s:complexType> </s:element> </s:schema> </types> - <message name=”DaireAlanSoapIn“> <part name=”parameters” element=”s0:DaireAlan” /> </message> - <message name=”DaireAlanSoapOut“> <part name=”parameters” element=”s0:DaireAlanResponse” /> </message> - <message name=”DaireCevreSoapIn“> <part name=”parameters” element=”s0:DaireCevre” /> </message> - <message name=”DaireCevreSoapOut“> <part name=”parameters” element=”s0:DaireCevreResponse” /> </message> - <portType name=”Geometrik_x0020_HesaplamalarSoap“> - <operation name=”DaireAlan“> <documentation>Daire Alan Hesabi Yapar</documentation> <input message=”s0:DaireAlanSoapIn” /> <output message=”s0:DaireAlanSoapOut” /> </operation> - <operation name=”DaireCevre“> <documentation>Daire Çevre Hesabi Yapar.</documentation> <input message=”s0:DaireCevreSoapIn” /> <output message=”s0:DaireCevreSoapOut” /> </operation> </portType>
- <binding name=”Geometrik_x0020_HesaplamalarSoap” type=”s0:Geometrik_x0020_HesaplamalarSoap“>
<soap:binding transport=”http://schemas.xmlsoap.org/soap/http” style=”document” /> - <operation name=”DaireAlan“> <soap:operation soapAction=”http://ilk/servis/DaireAlan” style=”document” /> - <input> <soap:body use=”literal” /> </input> - <output> <soap:body use=”literal” /> </output> </operation> - <operation name=”DaireCevre“> <soap:operation soapAction=”http://ilk/servis/DaireCevre” style=”document” /> - <input> <soap:body use=”literal” /> </input> - <output> <soap:body use=”literal” /> </output> </operation> </binding> - <service name=”Geometrik_x0020_Hesaplamalar“> <documentation>Geometrik Hesaplamalar Üzerine Metodlar Içerir. Ucgen, Dortgen gibi sekillere yönelik alan ve çevre hesaplamalari.</documentation> - <port name=”Geometrik_x0020_HesaplamalarSoap” binding=”s0:Geometrik_x0020_HesaplamalarSoap“> <soap:address location=”http://localhost/Geometri/GeoMat.asmx” /> </port> </service> </definitions>

Burada görüldüğü gibi bir XML belgesine neden ihtiyacımız olabilir? Dikkat edilecek olursa, bu XML belgesinde, Web Servisimize ait bir takım bilgiler yer almaktadır. Örneğin, Metodlara ilişkin parametre bilgileri veya WebService ve WebMethod niteliklerinde belirttiğimiz tanımlamalar gibi. İşte istemci bilgisayarlar bu XML çıktısını kullanarak, iletişim kuracakları web servsileri hakkında bilgi sahibi olurlar. Ancak burada asıl önemli olan nokta, Service Description bağlantısının, aşağıdaki şekilde oluşudur. Bu aslında, bir istemcinin, herhangibir web servisi hakkındaki bilgilere nasıl ulaşabileceğini göstermektedir.

http://localhost/Geometri/GeoMat.asmx?WSDL

Xml Web Servisleri - 3 ( Mimarinin Temelleri - SOAP) 

Bu makalemizde, Xml Web Servislerinin mimarisine daha yakında bakmaya çalışacak ve SOAP (Simple Object Access Protocol) �ı kısaca tanımaya çalışacağız.

Bir web servisinin, istemci uygulamalar tarafından nasıl kullanılabildiğini anlamak, web servislerinin mimarisini iyi bilmekle mümkündür. Mimariyi kolay bir şekilde anlayabilmek için, daha önceki makalemizde geliştirdiğimiz web servisi ve istemci uygulamayı göz önüne alacağız. Herşeyden önce geliştirdiğimiz web servisi local olarak test edilebilen ve tarayıcı üzerinde çalışabilen bir asmx dosyasından ve buna bağlı Code-Behind dosyasından oluşmaktadır. Web servisini test etmek için, web servisinin bulunduğu adresteki asmx uzantılı dosyayı, tarayıcı penceresinden çalıştırmak yeterlidir. Bunun sonucunda, tarayıcı penceresinde bu web servisi hakkındaki bilgilere ulaşabilir ve içerdiği metodları görebiliriz.

Ancak burada yer alan Service Description bağlantısı bize başka bir olanak daha sağlamaktadır. Bu bağlantı yardımıyla web servisimizin tüm içeriğini anlatan bir WSDL dökümanına erişebiliriz. WSDL dökümanının en önemli yanı, XML tabanlı bir içeriğe sahip olmasıdır. Diğer yandan bu döküman, web servisinde kullanılabilecek tüm metodlara, parametrelere ve dönüş değerlerine ilişkin bilgileri içermektedir.

Peki bu WSDL dökümanı ne için oluşturulur? İşte bu noktada istemci uygulamaya bir göz atmakta fayda vardır. İstemci uygulamanın web servisini kullanabilmesi için, ilk önce web servisinin bulunduğu adrese başvurması gerekir. Bu başvurunun ardından web servisine ait referansı istemci uygulamaya eklediğimizde, bir takım yeni dosyalarında uygulamaya eklendiğini görürüz. Bu dosyalardan belkide en önemli olanı Reference.cs isimli dosyadır. Geliştirdiğimiz uygulama ele alındığında Reference.cs dosyasının içeriği aşağıdaki gibi olacaktır.

using System.Diagnostics;
using System.Xml.Serializationg
using System;
using System.Web.Services.Protocols;
using System.ComponentModel;
using System.Web.Services;

 

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute(”code”)]
[System.Web.Services.WebServiceBindingAttribute(Name=”Geometrik HesaplamalarSoap”, Namespace=”http://ilk/servis/”)]
public class GeometrikHesaplamalar : System.Web.Services.Protocols.SoapHttpClientProtocol
{
public GeometrikHesaplamalar()
{
this.Url = “http://localhost/GeoWebServis/GeoMat.asmx”;
}

[System.Web.Services.Protocols.SoapDocumentMethodAttribute(”http://ilk/servis/DaireAlan”, RequestNamespace=”http://ilk/servis/”, ResponseNamespace=”http://ilk/servis/”, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public System.Double DaireAlan(System.Double r)
{
object[] results = this.Invoke(”DaireAlan”, new object[]{r});
return ((System.Double)(results[0]));
}

public System.IAsyncResult BeginDaireAlan(System.Double r, System.AsyncCallback callback, object asyncState)
{
return this.BeginInvoke(”DaireAlan”, new object[] {r}, callback, asyncState);
}

public System.Double EndDaireAlan(System.IAsyncResult asyncResult)
{
object[] results = this.EndInvoke(asyncResult);
return ((System.Double)(results[0]));
}

[System.Web.Services.Protocols.SoapDocumentMethodAttribute(”http://ilk/servis/DaireCevre”, RequestNamespace=”http://ilk/servis/”, ResponseNamespace=”http://ilk/servis/”, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public System.Double DaireCevre(System.Double r)
{
object[] re