Çözüldü MVC hata yönetimi

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

khalannz7

Centipat
Katılım
18 Ağustos 2022
Mesajlar
531
Çözümler
7
Yer
İstanbul
Daha fazla  
Cinsiyet
Erkek
Merhaba, hataları düzgün şekilde yönetmek istiyorum kullanıcının karşısına kendi oluşturduğum sayfaları çıkartmak istiyorum. Ama sorun şu ki sitenin içinde Ajax ile yaptığım işlemlerden hata alırsam, bu sayfalara yönlendirmek istemiyorum. Çünkü Catch'den JSON mesajı döndürüyorum ve bir JavaScript kütüphanesi ile bu mesajı gösteriyorum. Ama sorun şu ki customerros'a yazdığım sayfa her şekilde çıkıyor ve JavaScript ile gösterdiğim mesajı eziyor. Aşağıdaki gibi karmaşık şekilde yaptım bilgisi olan aydınlatabilir mi?
Kod:
 protected void Application_Error(object sender, EventArgs e)
        {
            Exception exception = Server.GetLastError();
            bool isAjaxRequest = Context.Request.Headers["X-Requested-With"] == "XMLHttpRequest";

            if (!isAjaxRequest)
            {
                if (exception is HttpException httpException)
                {
                    int httpCode = httpException.GetHttpCode();
                    if (httpCode == 404)
                    {
                        Response.Redirect("~/Error/NotFound");
                    }
                    else if (httpCode == 500)
                    {
                        Response.Redirect("~/Error/ServerError");
                    }
                    else
                    {
                        Response.Redirect("~/Error/Error");
                    }
                }
                else
                {
                    Response.Redirect("~/Error/Error");
                }
            }
        }
Kod:
<customErrors mode="On" defaultRedirect="~/Error/Error">
            <error statusCode="404" redirect="~/Error/NotFound"/>
            <error statusCode="500" redirect="~/Error/ServerError"/>
        </customErrors>
Kod:
public class ErrorController : Controller
    {
        [HttpGet]
        public ActionResult Error()
        {
            return View();
        }

        [HttpGet]
        public ActionResult NotFound()
        {
            Response.StatusCode = 404;
            Response.TrySkipIisCustomErrors = true;
            return View();
        }

        [HttpGet]
        public ActionResult ServerError()
        {
            Response.StatusCode = 500;
            Response.TrySkipIisCustomErrors = true;
            return View();
        }
    }
 
Son düzenleyen: Moderatör:
Çözüm
Global.asax.cs’te Route kayıta şunu ekleyip dener misiniz?
C#:
routes.MapRoute("Error", "{*url}",
    new { controller = "Error", action = "Error" }
);

Framework MVC ile çalışmadım ama Application_Error tetiklenmiyorsa uygulama o isteği URL’den sebep işlemiyor olabilir.
Action methodun hata verdiği için hataya düşüyorsundur. Action methoduna try-catch bloğu ekleyebilir catch de hatayı yakaladığında status ve message gibi bilgileri içeren değerleri gönderebilirsin. Ajax tarafında status, true veya false değerine göre işlem yaparsın.
 
Action methodun hata verdiği için hataya düşüyorsundur. Action methoduna try-catch bloğu ekleyebilir catch de hatayı yakaladığında status ve message gibi bilgileri içeren değerleri gönderebilirsin. Ajax tarafında status, true veya false değerine göre işlem yaparsın.
Hocam benim anlamadığım kodlarım böyleyken bilerek 403 hatası alıyorum. customErros'daki gibi "Error" sayfasına yönlendirmesi gerekirken HTTP nin kendi 403 sayfasını görüyorum anlayamadım gitti.
 
Hocam benim anlamadığım kodlarım böyleyken bilerek 403 hatası alıyorum. customErros'daki gibi "Error" sayfasına yönlendirmesi gerekirken HTTP nin kendi 403 sayfasını görüyorum anlayamadım gitti.
Development ortamında olduğun için olabilir. Öyle bir kontrol varsa kaldır. Ya da denemek için environment ayarlarından productiona çek.
 
Development ortamında olduğun için olabilir. Öyle bir kontrol varsa kaldır. Ya da denemek için environment ayarlarından productiona çek.
Hocam çok teşekkür ederim sizde hemen hemen her sorumda varsınız. Geç yazdığım için kusura bakmayın cebelleşiyorum hala kodlarla :D Tam olarak nasıl çekebilirim IIS Managerden mi?
 
Hocam çok teşekkür ederim sizde hemen hemen her sorumda varsınız. Geç yazdığım için kusura bakmayın cebelleşiyorum hala kodlarla :D Tam olarak nasıl çekebilirim IIS Managerden mi?
startup.cs/program.cs içerisinde environment.IsDevelopment gibi bir if var mı? Environment ayarı development ortamı için visual studioda projenin properties kısmından yapılabiliyor.
 
Şöyle ki, .NET FW ile hata işlemenin çok yolu var ve siz ikisini bir arada kullandığınız için hata alıyorsunuz. customErrors, doğrudan HTTP context ile ilgilenmez ve hata varsa uygulamayı manipüle eder. Size baş tavsiyem middleware ile try-catch bloğu kurmanız ama uğraşamam derseniz şöyle yapabilirsiniz:

.NET MVC’de her Controller’ın virtual olan bir OnException metodu bulunur. Her actionda hata alındığında önce bu metoda başvurulur. Bu metodu AJAX işlediğiniz Controller’da ezerek hatayı işleyebilirsiniz.

Örnek:
Kod:
public class UserMvcController : Controller
{
   protected override void OnException(ExceptionContext filterContext)
   {
      filterContext.ExceptionHandled = true;

      //Log the error!!
      _Logger.Error(filterContext.Exception);

      //Redirect or return a view, but not both.
      filterContext.Result = RedirectToAction("Index", "ErrorHandler");
      // OR
      filterContext.Result = new ViewResult
      {
         ViewName = "~/Views/ErrorHandler/Index.cshtml"
      };
   }
}
 

Yeni konular

Geri
Yukarı