"Enter"a basıp içeriğe geçin

Aspnet Mvc Hata Yönetimi ve Hataları Loglama

Aspnet Mvc Hata Yönetimi ve Hataları Loglama adlı bu başlıkta, 404, 500, 403 gibi yada buna benzer hataları belirleme, hata sayfasına yönlendirme ve tespit edilen hataları loglama işlemi nasıl yapılır bu paylaşımda bunu inceleceğiz.

Aşağıdaki yöntemler ile aspnet mvc’de hata yönetimi gerçekleştirilebilir.

  • HandleErrorAttribute
  • Controller.OnException Yöntemi
  • web.config dosyasındaki customErrors öğesi
  • web.config dosyasında httpErrors öğesi
  • Özel HttpModule

Biz işlemleri, global.asax dosyasında oluşturacağımız Application_Error metodu içerisinde halledeceğiz.

  • İyi bir hata yönetimi aşağıdaki yöntemlerin uygulanması gerekir.
  • Her hata kodu başına özel hata sayfası oluşturulması gerekir.
  • Arama motoru dizinine eklenmesini engellemek gerekir.
  • Http hatalarını düzeltmek için alınan hatanın log bilgisinin tutulması gerekir.

Örneğe geçmeden önce 403, 404 ve 500 hata kodunun ne anlama geldiğini kısaca açıklayalım.

403  : Erişim izninin olmadığını belirtir.

404 : İstek yapılan kaynağın (veya sayfanın) bulunamadığını belirtir.

500 : Sunucuda bir hata oluştuğunu ve isteğin karşılanmadığını belirtir.

Diğer hata kodlarını ve anlamlarını öğrenmek isterseniz;
https://www.mediaclick.com.tr/blog/http-server-durum-hata-kodlari-ve-anlamlari
linkini inceleyebilirsiniz.

Şimdi aspnet mvc projesi oluşturalım. Controller içerisinde ‘HomeController’ adında bir controller oluşturalım. (Sayfa yüklendiğinde bu controller’daki action methodu çalışacak.)
Şimdi HataController adında bir controller daha oluşturalım.

public class ErrorController : Controller
{
    //404, 400 hatası
    public ActionResult SayfaBulunamadi()
    {
        return View();
    }

    // 403 hatası
    public ActionResult ErisimIzninizYok()
    {
        return View();
    }

    //500 hatası
    public ActionResult SunucuHatasi()
    {
        return View();
    }
}

Burada sayfabulunamadi, erişimizniyok ve sunucuhatasi adında üç action metod oluşturdum. Artık yakalanan hatalara göre ilgili sayfaya yönlendirme işlemi yapabileceğiz. Şimdi log bilgilerini tutmak adına bir sınıf oluşturalım.

public class LogInfo
{
    public string Url { get; set; }
    public DateTime EklenmeTarihi { get; set; }
    public string HataMesaji { get; set; }
    public string IP { get; set; }
    public string Tarayici { get; set; }
    public string Dil { get; set; }
}

Loglama işlemi yaparken kullanıcının ip adresini öğrenmemiz gerekmektedir.IP adresi işlemi için ayrı bir static sınıf oluşturalım.

public static class KullaniciIPAdres
{
    public static string KullaniciIPBul()
    {
        var ipAddress = string.Empty;
        if (HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null)
            ipAddress = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();
        else if (HttpContext.Current.Request.ServerVariables["HTTP_CLIENT_IP"] != null && HttpContext.Current.Request.ServerVariables["HTTP_CLIENT_IP"].Length != 0)
            ipAddress = HttpContext.Current.Request.ServerVariables["HTTP_CLIENT_IP"];
        else if (HttpContext.Current.Request.UserHostAddress.Length != 0)
            ipAddress = HttpContext.Current.Request.UserHostName;
        return ipAddress;
    }
}

Şimdi global.asax dosyasını açalım ve Application_Error metodunu oluşturalım.

protected void Application_Error(object sender, EventArgs e)
{
    //Hatayı Yakala
    Exception exception = Server.GetLastError();
    Response.Clear();

    HttpException httpException = exception as HttpException;
    if (httpException != null)
    {
        // Log Bilgileri
        LogInfo log = new LogInfo
        {
            Url = Request.Url.ToString(),
            HataMesaji = httpException.Message,
            EklenmeTarihi = DateTime.Now,
            IP = KullaniciIPAdres.KullaniciIPBul(),
            Tarayici = Request.Browser.Browser,
            Dil = Request.ServerVariables["HTTP_ACCEPT_LANGUAGE"].Substring(0, 2)
        };
        // Log Bilgileri

        //Hata Koduna Göre Sayfaya Yönlendir
        switch (httpException.GetHttpCode())
        {
            case 403:
                Response.Redirect("/Error/ErisimIzninizYok");
                break;
            case 404:
                Response.Redirect("/Error/SayfaBulunamadi");
                break;
            case 500:
                Response.Redirect("/Error/SunucuHatasi");
                break;
            default:
                Response.Redirect("/Error/SayfaBulunamadi");
                break;
        }
        Server.ClearError();
    }
}

Yukarıda neler yaptık, kısaca özetleyelim.
Uygulamada bir hata alındığında Application_Error methodu çalışacak. Ardından yakalanan hata üzerinden işlemler yapılacak. Hata bilgileri ve bu hata ile karşılaşan kullanıcının tarayıcı bilgisi, ip adresi gibi bazı bilgileri LogInfo sınıfına aktarılacak. Ayrıca hata koduna göre belli bir sayfaya yönlendirme işlemi yapılacak.

İşlemler bu kadar arkadaşlar şimdi projeyi çalıştırıyorum. “localhost:****” olan url’i değiştirip  “localhost:****/fd” yapıyorum ve tamam diyorum. Böyle bir sayfa bulunamadığı için Application_Error metoduna giriyor.

Fakat hala daha küçük bir sorun var. Url’e localhost:****/asd/asx/asr/sdfsdcx gibi bir link girdiğimizde 404 hata karşımıza gelecek ve Application_Error içerisinde yakalayamayacağız, 404 hatası ekranda gözükecek. Bunun için eklenmesi gereken küçük bir kod var. App_Start klasörü altında bulunan RouteConfig dosyasını açın. RegisterRoutes methodu içinde en alt kısma alttaki kodu ekleyin.

routes.MapRoute(
"PageNotFound",
"{*url}",
new { controller = "Error", action = "SayfaBulunamadi" }
);

Arkadaşlar hata yönetimi ve hataları loglama ile ilgili anlatacak olduklarım bu kadar. Umarım işinizi görür. Diğer makalelerimde görüşmek dileğiyle iyi kodlamalar dilerim.

Yazıyı Paylaşmak İster misin?
Share on Facebook
Facebook
Pin on Pinterest
Pinterest
Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin
Share on Tumblr
Tumblr
Share on Reddit
Reddit
    Bir cevap yazın

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