Web Servis dediğimiz ne(değil)dir… -3-

WebException_thumb

   Xml web servisleriyle ilgili belki de gözden kaçırılan en önemli nokta sistemlerin hep ideal koşullar için tasarlanmasıdır. İstemci ya da sunucu kaynaklı hiç bir yavaşlamanın yaşanmadığı, sınırsız sunucu kaynaklarının olduğu ve hatta hizmetin hiç bir koşul altında hatalı duruma düşmediği/hata oluşmadığı varsayılır pek çok tasarımda. Gel gelelim ki xml web servisleri bir önceki yazımda da örneklemeye çalıştığım gibi geliştirme ortamının idealliğinden uzaklaşarak gerçek dünya ile tanıştığında pek çok projede işler tersine dönebiliyor.

Xml web servis hatası   Benim diyen hiç bir yazılım geliştirici kusursuz/hatasız bir kod yazabileceğini iddia edemez. Dolayısıyla da geliştirilen pek çok xml web servisin üretim ortamında hata verecek oluşu kaçınılmaz bir gerçektir. Hatta birazdan örnekleyeceğim bazı durumlarda da hatanın oluşması (tavsiye etmesem de) iş mantığının bir parçası dahi olabilir. Makale serisini takip edenler birazdan bu durumla ilgili olabilecek olumsuzlukları paylaşacağımı zaten tahmin ediyorlardır 🙂 Peki web servisinde oluşan bir hata ile ilgili nasıl bir problem olabilir ki? Zaten bir hata oluşmuş bile… 🙂

    Öncelikle, xml web servisinizde gerekli yapılandırmaları gerçekleştirmediyseniz sunucu tarafındaki kodunuza ait stack trace istemciye kadar gidecek ve kodunuzla ilgili zaman zaman kritik düzeyde olabilecek bilgi istemciler tarafından görülebilecektir, özellikle de kodunuzu sunucuya debug modunda attıysanız. Daha önceki yazılarımda da belirttiğim gibi böyle kritik hatalar bölgesel kamu projelerine ait xml web servislerinde de yapılabiliyor. Tabi ki de sonuç olarak çalıştırılan linq sorgusuna varıncaya kadar önemli pek çok veri istemcilerce görülebiliyor 😉

   Yukarıda belirttiğim sakıncanın yanında bu durumun bir başka doğurabileceği sıkıntı da sunucuda oluşan hata sonrasında istemcilerin hiç beklemedikleri bir yanıt alıyor olmasıdır. Pek çok istemci de, aynı sunucularda olduğu gibi, ideal koşullar düşünülerek tasarlanmaları nedeniyle hata bilgisini aldıklarında işleyişlerine doğru şekilde devam edemeyecek ve hatta belki de sonlanacaklardır. Tabi ki akıllı bir yazılım geliştirici iseniz böylesi durumları da göz önüne alarak hata yönetimi için gerekli düzenlemeleri de mutlaka yapmışsınızdır; ama beklenmedik bir hata her zaman için yönetilmesi zor olandır. Son kullanıcıya nasıl bir mesaj vermelisiniz? Son kullanıcı hatanın gerçekten karşı servisler kaynaklı olduğunu görebiliyor mu? ya da oluşan hatanın düzeltilmesi konusunda son kullanıcıyı yönlendirebilir misiniz? …WSDL

  Konun bir başka boyutu da, bazıları için önemli olmasa da proje yöneticisi olarak benim önem verdiğim, hata sonucunda istemciye döndüğünüz hata yanıtı kontratınıza (WSDL’inize) uygun mu? Serinin ilk yazısını anımsayın, en nihayetinde bir hizmet sunuyorsunuz ve aynı gerçek hayatta olduğu gibi istemci ile aranızdaki bir kontratla gelen-giden mesaj içeriklerini belirtiyorsunuz. Peki ya hata mesajınız? Hata mesajınızı belirttiniz mi?

   Bu noktada elinizin altında doğru olan bir kaç farklı yöntem var;

   Servisinizi geliştirirken hata olabileceğini göz önüne alarak yanıt mesajınızda hatalar için de bir bölüm ayırabilirsiniz. Örnek vermek gerekirse; yanıt mesajınızda içerisinde hata diye bir özellik ve içerisinde de hata kodu ve açıklaması için iki alt alan(lar) ekleyebilirsiniz. Ardından sunucu kodunuzdaki doğru bir hata yönetimi ile hiç bir istisna (exception) oluşmaksızın hatalar hakkındaki bilgiyi bu alanlarla istemciye sunabilirsiniz. Bu durumda istemci işlem sırasında hata oluşup oluşmadığını bu alanlardaki değerlere göre programsal olarak yorumlayabilir ve hatta hata oluşması durumunda hata kodundan yola çıkarak kullanıcıyı yönlendirebilir bile.. Örneğin; kullanıcı yetkilendirmesi yapılan bir işlemde hatalı kullanıcı bilgileri için iletilen 001 hata kodu istemci tarafında işlenerek son kullanıcı yetkilendirme için nereye başvurması gerektiği konusunda bilgilendirilebilir…

   Bu yönteme alternatif olarak; WSDL dosyanızda her bir metodunuz için hata oluşması durumunda dönebilecek hata (exception) nesnelerini belirtebilirsiniz. Bunun için SOAP:Fault’u rahatlıkla kullanabilirsiniz. Bu şekilde hata oluşması durumunda istemciye dönebileceğiniz hata nesneleri hakkında istemciyi kontratınızda bilgilendirmiş olacaksınız. İstemci de bu bilgiyi kullanarak hangi hataların gelebileceğini öngörebilecek ve buna göre bir kod yazılabilecektir.

Hata dokümanı   Üzülerek pek çok büyük projede ikinci seçeneğin akıllara bile gelmemiş olduğunu söylemem gerekir. Bu durum geliştiricinin arka planda kullanılan protokole hakim olamaması şeklinde açıklanabilir; ama en azında ilk paylaştığım yöntemin kullanılması kaliteli bir proje için beklenen bir durumdur. Gerçek hayattan örnekleri düşündüğümde ise yine üzülerek kamuya açık pek çok projede ya bu yöntemi de kullanmadığını ya da hata kodlaması yerine düz metinlerle kullanıcı bilgilendirdikleri söyleyebilirim.  Hatta kimi projelerde bu düz metinlerin bile güncellemeden güncellemeye değişebildiğini söylesem durumun vahimliğini sanırım anlatabilmiş olurum, elimizde işleyebilecek tutarlı bir bilgi dahi olmayacaktır…

  Hepsinden kötü olan bir diğer durum ise hata durumunun sistemin önüne yerleştirilen bir firewall tarafından filtrelenmesi olsa gerek. Bu durumda bazı senaryolarda geçerli bir soap yanıtı yerine düze bir html metin bile yanıt olarak gelebilir; ki böylesi bir yanıtın istemciler tarafında fark edilmesi ve işlenmesi oldukça güçtür hatta imkansızdır. Aklıma gelen en kötü örnek ise servislerinin ya da belirli bir metodunun bir süreliğine kapalı olduğu bilgisinin standart text metin ile dönüldüğü kamu projeleri..

Fatih Boy

Ankara'da yaşayan Fatih, bir kamu kurumunda danışman olarak çalışmaktadır. ALM süreçleri, kurumsal altyapı ve yazılım geliştirme konularında destek vermektedir. Boş zamanlarında açık kaynak kodlu projeler geliştirmeyi ve bilgisini yazdığı makalelerle paylaşmayı seven Fatih, aynı zamanda Visual C# konusundan Microsoft tarafından dört yıl üst üste MVP (En Değerli Profesyonel) ödülüne layık görülmüştür. İş hayatı boyunca masaüstü uygulamaları, web teknolojileri, akıllı istemciler gibi konularda Asp.Net, Php, C#, Java programlama dilleri ve MySql, MsSql ve Oracle gibi veritabanı yönetim yazılımları ile çalışmıştır. İngilizce ve Türkçe olarak yayınlanan makalelerini gerek İngilizce bloğunda, gerekse de Türkçe bloğunda bulabileceğiniz gibi web sitesinden de açık kaynak kodlu geliştirdiği yazılımlarına ulaşabilirsiniz.
vCard - Twitter - Facebook - Google+

2 yorum

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir