Çö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
603
Çözümler
8
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.
Şö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 Action'da 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"
 };
 }
}

Hocam şimdi şöyle bir sorunum var. Herhangi bir Controllerimde sayfa yüklenmesine bu kodu yazıyorum return new HttpStatusCodeResult(404);. Applicaton_error veya customerrors fark etmez ikisi de çalışmadan HTTP'nin kendi hata sayfasını görüyorum. Benim yönlendirmek istediğimi değil. Sadece customerros kullanarak da denedim, sadece application_error kullanarak da. Ama çözemedim bir türlü.
 
Bu yaptığınız hata yakalayıcıyı tetiklemez çünkü. Siz doğrudan 404 kodunu döndürüyorsunuz. Bunun yerine action’ın başına throw new Exception(); ekleyerek deneyin.
 
Bu yaptığınız hata yakalayıcıyı tetiklemez çünkü. Siz doğrudan 404 kodunu döndürüyorsunuz. Bunun yerine Action'ın başına throw new Exception(); ekleyerek deneyin.

Öyle yaptığımda kod catche düşüyor. Catchde zaten aynı error sayfasına yönlendiriyorum orada bir sıkıntı yok. Ama hocam şimdi siteyi yayınladığımda mesela hosting aldığım firmadan dolayı bir sıkıntı çıktı diyelim. Hata kodu 500 olup istediğim sayfaya girer mi acaba o zaman? Karışık anlattım çok kafam karıştı vallahi :D
 
Evet, 500’ün de varyasyonları var. Eğer 500 hatasını uygulama üretiyorsa (ki uygulama siz bir exception handling yapmazsanız bu otomatik oluşan bir şeydir) sizin custom error sayfanıza yönlendirecektir. Ama hata hostingin kendi hatası ise uygulama çalışamadığından 500 hosting tarafından döndürülür. Bu durum için hostingin kendi yapılandırmasını düzenlemeniz gerekir.

Hata yakalama ve özel sayfaya yönlendirme zaten prodüksiyon için vardır. Geliştirme ortamında açık error sayfaları kullanırız.
 
Bu yaptığınız hata yakalayıcıyı tetiklemez çünkü. Siz doğrudan 404 kodunu döndürüyorsunuz. Bunun yerine Action'ın başına throw new Exception(); ekleyerek deneyin.

Şöyle daha düzgün anlatmaya çalışayım. Hocam ilk projem olduğu için ben acemilik yaptım biraz. Bütün Action'larımı try catche aldım. 30'dan fazla Action'um var. Hepsinin catchinde ya error sayfasına yönlendirdim, ya da JSON döndürüp bir JavaScript kütüphanesi ile "sistemsel bir hata meydana geldi" mesajını gösterdim. Aslında bir sıkıntı yoktu çünkü bütün işlemlerim try catch içindeydi ve istediğim hata sayfalarına yönlendiriliyordu. Sonra route ayarları ile biraz oynamak istedim öğrenmek için geri alacaktım bir şey fark ettim ki bir hata aldım ve applicaton_error çalışmadan direkt HTTP'nin kendi hatasıydı bu, 404(route ayarları yaparken gitmek istediğim o sayfaya bir URL tanımlamamşıtım daha o yüzden). Sonra dedim ki kendi kendime ben hataları yönetiyorum her işlemimde catch kısmında loglayıp dönen şeyi kontrol ediyorum ama böyle beklenmedik bir durumda ne yapacağım. Bilmem anlatabildim mi hocam acemiliğime verin :D
 
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.
 
Çö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.

Oldu hocam :D Login Controllerime ( normalde bu sayfada bir yetki gerekmiyor) ama denemek için [Authorize] koydum. En başta çalıştırdığımda yine HTTP'nin kendi sayfası Unuthorize sayfasına yönlendirdi. Sonra da Routemi şu şekilde düzenledim ve beni error sayfasına yönlendirdi:
Kod:
public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Login", action = "Login", id = UrlParameter.Optional }
            );
        }
 
İşinize yaradıysa ne mutlu. Çözüm olarak raporlarsanız çok sevinirim. Yardıma ihtiyacınız olursa etiketleyebilirsiniz.
 
İşinize yaradıysa ne mutlu. Çözüm olarak raporlarsanız çok sevinirim. Yardıma ihtiyacınız olursa etiketleyebilirsiniz.
İşaretledim hocam çok teşekkür ederim. Peki sizce Route ayarlarımı böyle kullanmam mantıklı mı ? Alttaki default olan mapRoute bütün actionlarımı gezmemi vs. her şeyimi sağlıyor.
 
Bir problem yok. Uygulamanın zaten her URL’ye cevap vermesi gerek. Yoksa handling yapamazsınız. Hosting ağlar,
 

Yeni konular

Yeni mesajlar

Geri
Yukarı