Asp.NET MVC İle Custom Error Page(Özel Hata Sayfasına Yönlendirme)
Merhaba,
Asp.NET MVC mimarisiyle inşa edilen projelerde beklenmedik olası hatalar alındığında yahut yapılandırılmamış, bozuk adreslere kullanıcılar tarafından talepte bulunulduğunda öncelikle yapmamız gereken sistem tarafından fırlatılan hatayı kullanıcıya göstermeksizin kullanıcıyı özel bir sayfaya yönlendirmektir. İşte bu içeriğimizde bu işlemin nasıl yapılacağını ele alacak ve dikkat edilmesi gereken noktaları vurgulayacağız.
Şimdi düşünün; üzerinde çalıştığımız projede kullanıcı tarafından geçersiz bir adrese talepte bulunulduğu vakit nasıl bir sonuçla karşılaşılmaktadır?
Görüldüğü üzere “404 hatası” dediğimiz hatayla karşılaşılmaktadır.
Bu ve buna benzer birçok olası hata doğurabilecek durumlar için aşağıdaki talimatları izleyerek özel hata sayfanıza yönlendirmede bulunabilirsiniz.
Öncelikle yapmanız gereken, hatayı karşılayacak olan “Error(Controller).cs” isminde bir controller oluşturmanızdır.(Controller’ın adını konuyla alakadar olmak şartıyla istediğiniz şekilde belirtebilirsiniz.)
public class ErrorController : Controller { public ActionResult PageError() { Response.TrySkipIisCustomErrors = true; return View(); } public ActionResult Page404() { Response.StatusCode = 404; Response.TrySkipIisCustomErrors = true; return View("PageError"); } public ActionResult Page403() { Response.StatusCode = 403; Response.TrySkipIisCustomErrors = true; return View("PageError"); } public ActionResult Page500() { Response.StatusCode = 500; Response.TrySkipIisCustomErrors = true; return View("PageError"); } }
Yukarıdaki kod bloğunda görüldüğü gibi “Error(Controller).cs” içerisine aklıma gelen tüm hataları karşılamayı sağlayacak action metotları oluşturdum.(Tabi ki de siz daha fazlasını oluşturabilirsiniz.)
Tüm actionlar “PageError” sayfasına dönüş yapacağı için “PageError.cshtml” sayfasınıda aşağıdaki gibi oluşturuyorum.
<h2>Sayfa bulunamadı...</h2> <div> Hata Kodu : @Response.StatusCode </div> <div> Hata Sebebi : @ViewBag.Kaynak </div>
Bu işlemden sonra ana dizindeki Web.config dosyasını açınız ve <system.web>…</system.web> nodeları içerisine aşağıdaki kalıbı yerleştiriniz.
. . . <system.web> <customErrors mode="On"> <error statusCode="404" redirect="/Error/Page404"/> </customErrors> <compilation debug="true" targetFramework="4.6.1"/> <httpRuntime targetFramework="4.6.1"/> </system.web> . . .
Dikkat ederseniz burada “customErrors” nodeu ile özel hata kontrolünü devreye sokmuş bulunuyoruz. “error” nodu ile de “statusCode” u 404 olan hata için “/Error/Page404” sayfasına yönlendirmede bulunuyoruz.
Bu işlemden sonra projemizi derleyip çalıştıralım ve bilinçli olarak 404 hatasını alarak süreci yeniden gözlemleyelim.
Videodan da gördüğünüz üzere olası bir hata durumunda Web.config’te yaptığımız düzenleme devreye girmekte ve verilen adrese ilgili kullanıcı yönlendirilmektedir.
Burada dikkatinizi bir hususa çekmek istiyorum. Videoda da görüldüğü üzere yönlendirme yapılırken “http://localhost:****/Error/Page404?aspxerrorpath=/gecersizadres” şeklinde karışık ve MVC’nin yapısına uymayan bir tarzda adres oluşturulmuştur. Adresteki “aspxerrorpath” parametresi hangi değerin 404 hatasına sebep olduğunu göstermektedir. Eğer ki bu adresi ve gelen “aspxerrorpath” parametresini yönetmek istiyorsanız aşağıdaki gibi bir çalışma yapmanız yeterli olacaktır.
public class ErrorController : Controller { . . . public ActionResult Page404(string aspxerrorpath) { if (!string.IsNullOrEmpty(aspxerrorpath)) ViewBag.Kaynak = aspxerrorpath; Response.StatusCode = 404; Response.TrySkipIisCustomErrors = true; return View("PageError"); } . . . }
Velhasıl, oluşan olası hataları bu şekilde Web.config ile yönlendirebilmekteyiz. Ayriyetten olası hataları, “Global.asax” dosyasıylada yönlendirebiliriz. “Global.asax” dosyası, Asp.NET mimarisinde etkili bir hata yönetimi(Error Handling) sunmaktadır. Uygulamadaki tüm request(talep) ve response(cevap)ların yönetildiği ve bunlara ait eventların yakalandığı yer “Global.asax” dosyasıdır. İlgili dosya içerisinde “Application_Error()” metodu, uygulamanın herhangi bir yerinde herhangi bir kaynaktan dolayı meydana gelen hataları yakalamakla mükelleftir. Şimdi gelin birde olayı bu yapıyla ele alalım.
Öncelikle RouteConfig dosyasına aşağıdaki gibi bir route şeması ekleyelim.
public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { . . . routes.MapRoute( name: "Hata", url: "hata/{kod}", defaults: new { controller = "Error", action = "Page404", kod = UrlParameter.Optional } ); . . . } }
Bu route şeması birazdan “Global.asax” dosyasından yapacağımız yönlendirmenin adres şeması olacaktır.
public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); } protected void Application_Error(object sender, EventArgs e) { Exception ex = Server.GetLastError(); if (ex is HttpException && ((HttpException)ex).GetHttpCode() == 404) { Response.Redirect("hata/404"); } } }
Evet… Görüldüğü üzere olası hata alındığı an Application_Error() metodu devreye girecek ve ilgili hatanın kodu denetlenip kullanıcı yukarıda oluşturduğumuz routea uygun adrese yönlendirilecektir.
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar dilerim…
çok teşekkür ederim çok güzel bir makale
Merhaba,
Sadece tanımladığımız hata kodlarındamı geçerli bu yöntem, unuttuğumuz aklımıza gelmeyen hata kodlarında nasıl yönlendirme yapabiliriz.
Elinize sağlık. Güzel bir makale olmuş. Bilgiyi paylaşarak bilgili bir toplum olabiliriz.
paylasım için tesekkürler . videolarınızı sesli yaparsanız izleyenler için daha iyi olacağını düşünüyorum yinede sagolun işime yaradı
Merhaba hocam ben web.config ten 404 hatasını erorr controlüne yonlendirdim query string(aspxerrorpath) kısmını nasıl kaldırabiliriz Page404 action ına eklediğiniz kod kısmınıda ekledim yinede çıkıyor bunun çözümü global.asax mi acaba yani Application_Error den mi yönledirecez çok teşekkürler şimdiden.