Maxspan tarafından gönderilen cevabı temel alarak GitHub'da tüm çalışma parçalarını gösteren minimal bir örnek proje hazırladım .
Temel olarak, istisnayı durdurmak ve bize özel bir hata sayfasına yönlendirme (veya daha doğru bir şekilde aktarma isteği ) fırsatı vermek Application_Error
için global.asax.cs dosyasına bir yöntem ekliyoruz .
protected void Application_Error(Object sender, EventArgs e)
{
// See http://stackoverflow.com/questions/13905164/how-to-make-custom-error-pages-work-in-asp-net-mvc-4
// for additional context on use of this technique
var exception = Server.GetLastError();
if (exception != null)
{
// This would be a good place to log any relevant details about the exception.
// Since we are going to pass exception information to our error page via querystring,
// it will only be practical to issue a short message. Further detail would have to be logged somewhere.
// This will invoke our error page, passing the exception message via querystring parameter
// Note that we chose to use Server.TransferRequest, which is only supported in IIS 7 and above.
// As an alternative, Response.Redirect could be used instead.
// Server.Transfer does not work (see https://support.microsoft.com/en-us/kb/320439 )
Server.TransferRequest("~/Error?Message=" + exception.Message);
}
}
Hata Denetleyicisi:
/// <summary>
/// This controller exists to provide the error page
/// </summary>
public class ErrorController : Controller
{
/// <summary>
/// This action represents the error page
/// </summary>
/// <param name="Message">Error message to be displayed (provided via querystring parameter - a design choice)</param>
/// <returns></returns>
public ActionResult Index(string Message)
{
// We choose to use the ViewBag to communicate the error message to the view
ViewBag.Message = Message;
return View();
}
}
Hata sayfası Görünümü:
<!DOCTYPE html>
<html>
<head>
<title>Error</title>
</head>
<body>
<h2>My Error</h2>
<p>@ViewBag.Message</p>
</body>
</html>
FilterConfig.csfilters.Add(new HandleErrorAttribute())
içinde devre dışı bırakmak / kaldırmak dışında başka bir şey yoktur
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//filters.Add(new HandleErrorAttribute()); // <== disable/remove
}
}
Uygulanması çok basit olsa da, bu yaklaşımda gördüğüm tek dezavantaj, hedef hata sayfasına istisna bilgileri sunmak için querystring kullanmaktır.