Asp.Net Error Feedback
28 Aralık Pazartesi, 2009 | Asp.net C# /*Yorumlar (5)*/
"Hatasız bir uygulama yazmak için kullanıcıyı ortadan kaldırmaktır" (sanırım buna benzer bir şeydi) diye duymuştum bir zamanlar. Yazılımlarımızda hatalar olacak. Bu kaçınılmaz ama en aza indirmek içinde çaba sarfetmek te bizim görevimiz. Lakin bunun için her yere try cacth blokları da koymak pek mantıklı bir yaklaşım değil:)
Bu durumlar için, özellikle web uygulamalarında Error Feedback denilen bir yöntem çok sık kullanılır.
Amaç;
çalışma zamanı bir sayfada ya da ona bağlı bir uygulamada hata oluştuğunda, hata ile ilgili detayların geliştiriciye e-mail olarak gönderilmesi daha sonra da kullanıcıya hata mesajı yerine basit bir html sayfası gösterilmesinden ibaret.
Error isiminde bir classnesne oluşturalım. Oluşan hata ile ilgili gerekli bilgileri birer özellikproperty olarak belirleyelim.
Time : Hata ne zaman oluştu?
Message : Oluşan hata nedir? -> Exception.Message
Ip : Hataya maruz kalan kullanıcı Ip adresi nedir?
Page : Hatanın oluştuğu sayfa hangisi?
Details : Oluşan hatanın detayları? -> Exception.Source
public class Error
{
public DateTime Time { get; set; }
public string Message { get; set; }
public string Ip { get; set; }
public string Page { get; set; }
public string Details { get; set; }
}
Gönderilecek Feefback için güzle bir html şablonu oluşturalım. Şablon içinde bilgi gireceğimiz alanları küme parantez parametreleri ile işaretleteyim ki String nesnesini Format metotu ile rahatça kullanabilelim. Oluşan şablonu App_Data klasörünün altına koyuyoruz.
Error nesnesine hizmet edecek ErrorProvider adında yardımcı bir nesne daha oluşturuyoruz. Nesneye CreateMessage adında static bir metot ekliyoruz.
Metotun görevi;
daha önce hazırladığımız şablonu okumak ve parametre olarak verilen error nesnesinden gelen bilgileri şablondaki gerekli yerlere yerleştirmek. Son olarakta oluşan bilgiyi e-mail olarak göndermek. (SendMail metotu için projeye bakınız)
public class ErrorProvider
{
public static void CreateMessage(Error error)
{
string content = File.ReadAllText(
HttpContext.Current.Server.MapPath("App_Data/error.txt"));
content = string.Format(
content, error.Time.ToString("dd.MMM.yyyy HH:mm"),
error.Page, error.Ip,
error.Message,
error.Details);
SharedClass.SendMail(
"developer@domain.com", "Raise Error", content);
}
}
Herşey tamam gibi. Sırada oluşabilecek hataları elde elebileceğimiz Global Application Class' ından yardım almaya geldi. Global.asax ' ın Application_Error adlı metotu, uygulama içinde hata oluştuğunda otomatik devreye girer. Bizde burada devreye girip ihtiyacımız olab kodları yazıyoruz.
protected void Application_Error(object sender, EventArgs e)
{
Exception exteption = Server.GetLastError();
Error error = new Error();
error.Message = exteption.Message;
error.Details = exteption.Source;
error.Time = DateTime.Now;
error.Page = Request.UrlReferrer.AbsoluteUri;
error.Ip = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (error.Ip == null || error.Ip == string.Empty || error.Ip == "unknown")
error.Ip = Request.ServerVariables["REMOTE_ADDR"];
ErrorProvider.CreateMessage(error);
Server.ClearError();
}
Son bir adım kaldı. Kullanıcı hata mesajları yerine bizim belirlediğimiz sayfaları görsün.
<customErrors mode="On" defaultRedirect="~/Error/GenericErrorPage.htm"> <error statusCode="403" redirect="~/Error/NoAccess.htm"/> <error statusCode="404" redirect="~/Error/FileNotFound.htm"/> </customErrors>
web.config dosyası içindeki customError -> mode özelliğini On olarak değiştiriyoruz. Daha sonra error alt düğümleri ile olası hatalar için uygun sayfaların yollarını redirect özellikleri ile belirttikten sonra uygulamada bitmiş oluyor.
Örnek proje.
