Server-Side’dan Dönen Özelleştirilmiş Hataları AJAX Call’da Yakalama
Selamlar;
Bugün ASP.NET Mvc bir projede client side tarafından bir action çağrıldığında, server side tarafta bir hata oluşur ise client tarafında ilgili hatayı detaylı bir şekilde nasıl yakalanır onu inceleyeceğiz. Normalde ilgili hata client side tarafta default olarak “HTTP 500 error” olarak alınır.
Eğer kendi custom mesajımızı almak istiyor isek kendi custom error nesnemizi yaratmalıyız. Bunun Jquery tarafından malesef pek bir çözümü yok. Server side tarafından “HttpStatusCodeResult” dönüş tipli bir sınıf yaratılarak bizim belirlediğimiz hata mesajı döndürülebilir. Bu mesajlar belli bir hata alınmadan da gönderilebilir. Örneğin ilgili kayıt bulunamadı. Yada seçili kişinin yaşı belirlenen kriterlere uygun değil gibi. İsterseniz lafı daha fazla uzatmadan kodumuza geçelim.
return new HttpStatusCodeResult(440, “Login Süreniz Dolmuştur.”)
Öncelikle boş bir Mvc projesi yaratılır. Aşağıda ekrana basılacak, Person sınıfına ait data model tanımlanmıştır:
1 2 3 4 5 6 7 8 9 |
public class Person { public int id { get; set; } public string firstName { get; set; } public string lastName { get; set; } public DateTime createdOn { get; set; } public DateTime birthday { get; set; } public int salary { get; set; } } |
Aşağıda person sınıfına ait test amaçlı çekilen data sınıfı gözükmektedir:
1 2 3 4 5 6 7 8 9 10 11 12 |
public Person[] GetDumpData() { Person[] Persons = new Person[] { new Person {id=1,firstName="John",lastName= "Doe", createdOn= DateTime.Parse("1/1/2012"), birthday= DateTime.Parse("1/1/1977"), salary= 40000}, new Person {id=2,firstName="Jane",lastName= "Harper", createdOn= DateTime.Parse("1/2/2012"), birthday= DateTime.Parse("2/1/1976"), salary= 44000}, new Person {id=3,firstName="Jim",lastName= "Carrey", createdOn= DateTime.Parse("1/3/2012"), birthday= DateTime.Parse("3/5/2010"), salary= 60000}, new Person {id=4,firstName="Joe",lastName= "DiMaggio", createdOn= DateTime.Parse("1/4/2012"), birthday= DateTime.Parse("3/1/1985"), salary= 70000}, new Person {id=5,firstName="Bora",lastName= "Kasmer", createdOn= DateTime.Parse("1/5/2012"), birthday= DateTime.Parse("4/1/2008"), salary= 80000} }; return Persons; } |
Index.cshtm: Aşağıda aranılacak kişinin adının girildiği bir “textbox” , arama “buttonu” ve dönen sonucun yazılacağı bir “texarea” tanımlanmaktadır. Arama işleminde “TestAjax()” methodu tetiklenmekete ve “findCustomer()” action’ı Ajax call ile çağrılmaktadır. “error” kısmında gelen hata kodlarına göre çeşitli operasyonlar yapılmaktadır. Buradan çıkarılacak sonuç farklı durumlar için farklı hata kodları üretilir ve herbir hata kodu için farklı processler devreye alınır. İlgili HTTP status codeları buradan bulabilirsiniz. Eğer 400’lü hata kodlarından birini alır isek bu daha çok client taraflı çözülmesi gereken bir hata olduğu ortaya çıkacaktır. Hata kodları arasında bana göre en ilginci 418 (“I’m a teapot”) olan:) Artık ne düşünülerek yazıldı ise:)
Aşağıdaki örnekte “416,418 ve 426” hata kodları yakalanmıştır. Ve herbiri için farklı işlemler yapılmıştır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
@{ Layout = null; } <!DOCTYPE html> <html> <head> <script src="~/Scripts/jquery-2.1.4.min.js"></script> <meta name="viewport" content="width=device-width" /> <title>Index</title> <script> function TestAjax() { $.ajax({ url: '/findCustomer', data: { name: $('#srcPerson').val() }, success: function (result) { $('#prsInfo').show(); $('#prsInfo').html(result); }, error: function (xhr, httpStatusMessage, customErrorMessage) { if (xhr.status === 418) { $('#prsInfo').show(); $('#prsInfo').html(customErrorMessage); } if (xhr.status === 426) { alert(customErrorMessage); } if (xhr.status === 416) { $('#prsInfo').show(); $('#prsInfo').html(customErrorMessage);; } } }); } </script> </head> <body> <div> <b>Bulunacak Kişi: </b><input type="text" id="srcPerson" /> <input type="button" onclick="TestAjax()" value="Kişiyi Bul" /><br /> <b>Bilgiler:</b> <br /><textarea cols="70" rows="5" id="prsInfo" style="display: none;"/> </div> </body> </html> |
HomeController.cs/findCustomer(): Aşağıda görüldüğü gibi öncelikle ilgili dummy data çekilmiştir. Daha sonra ilgili isme göre filter işlemi yapılıp, belirli kriterlere göre ya hata ya da sonuç geri dönülmüştür. Yapılan filter işlemleri aşama sırasına göre aşağıdaki gibi sıralanmıştır.
1-)Null kontorlü yapılmış ve kayıt bulunamaması durumunda “426” hata kodu ve ilgili hata mesajı dönülmüştür.
2-)Custom maaş filitresi yazılmış ve 45000’den az olanlar için “416” hata kodu ve ilgili hata mesajı dönülmüştür.
3-)Son filter da yaş için yazılmıştır. 18 yaşından küçükler için “418” hata kodu ve ilgili hata mesajı dönülmüştür.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public ActionResult findCustomer(string name) { var data = GetDumpData().Where(prs => prs.firstName.ToLower() == name.ToLower()).FirstOrDefault(); if (data == null) return new HttpStatusCodeResult(426, "Aranan Kisi bulunamadi."); else { if (data.salary < 45000) { return new HttpStatusCodeResult(416, data.firstName + " " + data.lastName + "'in maasi 45000'den az oldugu için sisteme dahil edilmemektedir."); } else { int age = DateTime.Now.Subtract(data.birthday).Days / 365; if (age > 18) return Content("İsim:" + data.firstName + " Soy İsim:" + data.lastName + " Doğum Tarihi:" + data.birthday + " Maaş:" + data.salary); else return new HttpStatusCodeResult(418, "Aranan Kisinin Yasi Tutmamaktadir."); } } } |
Geldik bir makalenin daha sonuna. Bu makalede “$.ajax ” call işleminde server side tarafında bir hata oluştuğu zaman classic”HTTP 500 error” hatası yerine duruma göre “HttpStatusCodeResult” tipinde nasıl custom hatalar döndürülebileceğini gördük. Yeni bir makalede görüşmek üzere hoşçakalın.
Yararlanılan Kaynak: visualstudiomagazine.com
Source: https://visualstudiomagazine.com/blogs/tool-tracker/2015/10/return-server-side-errors-ajax.aspx
Ellerinize sağlık değerli yazınız için :)
Teşekkürler Mustafa;
Ne zamandır aradığım bir konu idi çok güzel anlatmışınız teşekkürler.
Çok teşekkür ederim Şehnur.