
Web Servis dediğimiz ne(değil)dir… -1-
Bundan yaklaşık 2 yıl önce sizlerle WCF’e giriş niteliğinde bir makale paylaşmıştım ve aslına bakarsanız düşündüğümün de üzerinde ilgi çekti. Yapılan yorumlardan sonra fırsat buldukça WCF’ten bahsetmek faydalı olacaktır diye düşünmeye başladım; ama bunun da öncesinde sizlerle öncelikle web servisler, özelde de xml web servisler, konusunda fikir alışverişinde bulunmak istedim. Ne de olsa WCF’in en yoğun kullanıldığı alanlardan birisi xml web servisleri.
Bu konu üzerine sizlerle paylaşacaklarımı düşünürken en faydalı ve konunun en rahat anlaşılacağı yöntemin gerçek hayattan örnekler üzerinden gitmek olduğuna karar verdim. İş hayatında 3.parti sistemlerle entegrasyon konusunda edindiğim deneyim sayesinde örnek bulmak aslına bakarsanız pek de zor olmadı; ama sıkıntı şu ki bu örneklerin neredeyse hepsi olumsuzdu. Bir web servisin nasıl olması, nasıl tasarlanması gerektiğinden öte nasıl olmaması/tasarlanmaması gerektiğini sizlere anlatacaklardı. Şimdi düşününce, kötü de bir fikir değil aslında 😉 Doğrunun yanında yanlışı da bilmek faydalı olacaktır, başkalarının olumsuz deneyimleri de bize katma değer sağlayacaktır…
Ok, konu üzerinde daha fazla ilerlemeden en basit kavramları kafamızda netleştirelim. Öncelikle, neden xml web servisleri? Çünkü veri paylaşımı konusundaki alternatifleri olan Object Management Group (OMG), Common Object Request Broker Architecture (CORBA), Microsoft’un Distributed Component Object Model (DCOM) ya da Java’nın Remote Method Invocation (RMI) ile kıyasladığımızda Xml platform ve teknoloji bağımsızdır, günümüzün neredeyse tüm modern dillerince desteklenir. Bu özellikleri sayesinde xml veri taşımak için ideal bir seçenek haline geliyor.
Eğer web ortamında (ya da günümüz modern deyişiyle, bulutta) veri paylaşımından konuşacaksak kaçınılmaz olarak teknoloji ve platform bağımsızlığı bizim için bir seçenek değil zorunluluk olacaktır. Aksi takdirde tüm istemcilerle veri paylaşıyor olmak mümkün olmayacaktır. Durum böyle olunca web’te veri paylaşımı/hizmeti yapan uygulamaların xml tabanlı bir standardı tercih etmesi doğaldır. Bu artık öyle kanıtsanmıştır ki, web servis deyince pek çoklarının aklına xml web servislerinden başka bir şey gelmemektedir.

Bu paylaşımlarım ardından web ortamında, bulutta, veri paylaşımını hangi formatta yapabileceğimizi netleştirdiğimizi umuyorum. Sırada netleşmesi gereken ikinci bir konu var; format belli, peki ama neyi paylaşacağım? Veriyi ne şekilde paylaşacağımı, daha da önemlisi hangi veriyi paylaşacağımı anlatamadığım sürece bir web servisine sahip olmanın hiç bir anlamı olmayacaktır. Kimse bu veriyi/hizmeti kullanamayacaktır. İşte bu noktada sahneye Web Servis Tanımlama Dili (Web Service Description Language, WSDL) çıkıyor. Veriyi hangi adresten/porttan sunacağımı, hangi hizmetleri sunacağımı, servisimin kabul ettiği ve geriye döndüğü verileri bu tanımlama dili yardımıyla tüm istemcilere rahatlıkla anlatabilirim. Bu haliyle WSDL aslında gerçek yaşamdaki kontratlardan çokta farklı değil. Aynı gerçek hayatta altına imza attığımız bir kontrata uymamız, orada belirtilenleri sunmamız gerektiği gibi WSDL içerisinde yazdığımız hizmet ve veriyi belirttiğimiz şekilde sunmalıyız.
Yukarıda paylaştıklarım ardından kafanızda web servislerin daha netleştiğini, artık daha doğru konumlandığını umuyorum. Peki bu kadar ön bilgiyi neden verdim derseniz… okumaya devam edin…
Maalesef ki iş hayatında, yukarıdaki xml web servisi kavramıyla ters düşen pek çok servis karşınıza gelebilir. İşte benim karşılaştığım örnekler;
Web Servislerinde Dataset kullanımı
DataSet .Net’e özel bir veri türüdür. string, int ve benzer primitif veri türlerinden farklı olarak pek çok programlama dilinde doğrudan bir karşılığı yoktur. Dolayısıyla herkese açık bir xml web servisinde DataSet kullanacak olursanız, .Net kullanmayan tüm istemciler entegre olmakta problem yaşayacaklardır. Bu da daha en başından xml web servislerinin ruhuna aykırı bir durum oluşturur. Üstelik tüm problemler bununla da sınırlı değil… Sadece .net istemcilerin bağlanacağı bir senaryoda dahi başınız ağrıyacaktır. Nedeni anlamak için en basit haliyle DataSet dönen bir fonksiyonu ele alalım;
public DataSet DataSetDonenBirMetod()
Bunu bir xml web servisine dönüştürdüğümüzde bize aşağıdakine benzer bir yanıt vereceğini söyleyecektir;
<?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> <DataSetDonenBirMetodResponse xmlns="https://fatihboy.com/"> <DataSetDonenBirMetodResult> <xsd:schema>schema</xsd:schema>xml</DataSetDonenBirMetodResult> </DataSetDonenBirMetodResponse> </soap:Body> </soap:Envelope>
Peki bu bize ne ifade ediyor? Ben hemen söyleyeyim; hiç bir şey…Bu DataSet’te hangi alanlar olacak? Bu alanların veri türleri nedir? hiç birisini bildirmiyorsunuz. Bu durumda WSDL dokümanınız, yani kontratınız, aslında hiç bir şey ifade etmeyecektir. Başka bir ifade ile bir hizmet satıyorsunuz; ama alıcıya bu hizmetin içeriğini söylemiyorsunuz, bu durumda hizmetiniz kimse satın almaz…
Böylesi bir servisten dönen veriyi tarif etmek için WSDL tek başına yeterli gelmeyecek, ek dokümanlar sunmanız gerekecek. DataSet içerisinde şu şu alanlar var, bunların da veri türü budur demeniz gerekecektir. Üstelik WSDL’den otomatik kod üretilebiliyorken, DataSet için bu geçerli değil…
Bir başka önemli noktada DataSet kullandığınız için .net altyapısının gelen veriyi doğrulayamayacak, verdiğiniz alanların olup olmadığının, bu alan değerlerinin doğru olup olmadığının kontrolü tamamen size kalacaktır. Öte yandan bu alanları normal şekilde tanımlıyor olsaydınız daha xml web servisinizden girmeden alt yapı tarafından tür kontrolleri yapılarak hatalı türler de istemci bilgilendirilecektir.
Bir başka senaryoda kabul ettiğiniz veri içeriğinin yani DataSet’inizin değiştiğini düşünün. Bu senaryoda WDSL dokümanınız aynı kalacaktır. İstemcilerin servisin değiştiğinden haberdar olmalarının tek yolu ek dokümanları düzenli olarak takip etmek olacaktır…
Tüm bu olumsuzluklar ardından, eğer sadece siz kendi uygulamanızda kullanmıyorsanız Xml Web Servislerinde DataSet kullanımını kesinlikle tavsiye etmiyorum… Maalesef bu makaleyi kaleme aldığım sırada halen xml web servislerinde DataSet’ler ile işlem yapan önemli kamu projeleri bulunmaktaydı. Bu projelerin daha giriş kapısı bile böyle bozukken içeriğinin nasıl olabileceğini sizin hayal gücünüze bırakıyorum, bir etkinlikte verilecek bir arada detayları anlatabilirim 😉
Bu makalenin devamında xml web servislerindeki hatalı kullanımlara örnekleri bulabileceksiniz.