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.

Mail Text

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.

Yorumlar

Rıdva

hocam süper maaşallah

27 Şubat Cumartesi, 2010

yunus emre keskin

merhabalar yapılan uygulamayı kendim aynen uyguladım fakat string.format kısmında hata veriyor. daha sonra sizin uygulamanızı indirip denedim. yine aynı kısımda hata verdi. neden olabilir acaba...    

17 Temmuz Cumartesi, 2010

Emre AYRILMAZ

Merhaba, css kodlarında bir sorun olmuş. Düzelttim.

17 Temmuz Cumartesi, 2010

yunus emre keskin

teşşekkür ederim...

17 Temmuz Cumartesi, 2010

Gürsel

Emre bey maalesef bende düzgün çalışmıyor ya da ben beceremeiyorum :( sizi projede çalışırken boş beyaz bir sayfa çıkardı debug edildiğinde...bir de ben tabi vs 2010 da .net 4.0 a çevirip kullandım...projelerimde de kullanıyorum fakat hep filenotfound.htm döndürüyor onu da göstermiyor....sayfada The system cannot find the path specified.neen bu hatayı alıyorum ve düzgün çalıştıramıyorum??? teşekkürler...gerekirse projeyi gönderirim...tabi isterseniz...

25 Mart Pazar, 2012

Yorum Yaz

Ad

Email (sahte adresli yorumlar silinir.)

Yorum