Hızlı Yanıt / TL; DR
Dışarıdaki tembel insanlar için:
Install-Package MagicalUnicornMvcErrorToolkit -Version 1.0
Ardından bu satırı global.asax
GlobalFilters.Filters.Add(new HandleErrorAttribute());
Ve bu yalnızca IIS7 + ve IIS Express içindir.
Eğer Cassini kullanıyorsanız .. iyi .. um .. er .. garip ...
Uzun, açıklanmış cevap
Bunun cevaplandığını biliyorum. Ama cevap GERÇEKTEN BASİT ( David Fowler ve Damian Edwards'a bunu gerçekten cevapladığı için tezahürat ediyor ).
Orada her şey özel yapmaya gerek .
Çünkü ASP.NET MVC3
tüm bitler ve parçalar orada.
Adım 1 -> İKİ noktadaki web.config dosyanızı güncelleyin.
<system.web>
<customErrors mode="On" defaultRedirect="/ServerError">
<error statusCode="404" redirect="/NotFound" />
</customErrors>
ve
<system.webServer>
<httpErrors errorMode="Custom">
<remove statusCode="404" subStatusCode="-1" />
<error statusCode="404" path="/NotFound" responseMode="ExecuteURL" />
<remove statusCode="500" subStatusCode="-1" />
<error statusCode="500" path="/ServerError" responseMode="ExecuteURL" />
</httpErrors>
...
<system.webServer>
...
</system.web>
Şimdi kullanmaya karar verdiğim GÜZERGAHLAR'a dikkat edin. Her şeyi kullanabilirsiniz, ancak rotalarım
/NotFound
<- bulunamadı 404 için hata sayfası.
/ServerError
<- diğer hatalar için kodumda meydana gelen hataları dahil et. bu 500 Dahili Sunucu Hatası
İlk bölümün nasıl <system.web>
yalnızca bir özel girişi olduğunu görüyor musunuz? statusCode="404"
Entry? Ben sadece bir durum kodu listeledim çünkü dahil tüm diğer hatalar, 500 Server Error
(yani. Kodunuzda bir hata olduğunda ve kullanıcının isteğini çöktüğünde oluşan sinir bozucu hata) .. diğer tüm hatalar ayar tarafından işlenir defaultRedirect="/ServerError"
.. diyor , bir 404 sayfası bulunamadıysanız, lütfen rotayı seçin /ServerError
.
Tamam. bu yoldan çıktı .. şimdi listelenen rotalarımaglobal.asax
Adım 2 - Global.asax'ta rota oluşturma
İşte tam rota bölümüm ..
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("{*favicon}", new {favicon = @"(.*/)?favicon.ico(/.*)?"});
routes.MapRoute(
"Error - 404",
"NotFound",
new { controller = "Error", action = "NotFound" }
);
routes.MapRoute(
"Error - 500",
"ServerError",
new { controller = "Error", action = "ServerError"}
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new {controller = "Home", action = "Index", id = UrlParameter.Optional}
);
}
Bu iki göz ardı rotaları listeler -> axd's
ve favicons
(ooo! İkramiye göz ardı rotası, sizin için!) Sonra (ve sipariş BURADA ZORUNLU olduğunu), benim iki açık hata işleme yolları var .. ve sonra başka herhangi bir yol. Bu durumda, varsayılan olan. Tabii ki, daha fazlasına sahibim, ama bu web siteme özel. Hata yollarının listenin en üstünde olduğundan emin olun. Düzen zorunludur .
Son olarak, global.asax
dosyamızın içindeyken , HandleError özniteliğini global olarak kaydetmiyoruz. Hayır, hayır, efendim. Nadda. Hayır! Nien. Olumsuz. Noooooooooo ...
Bu satırı şuradan kaldır: global.asax
GlobalFilters.Filters.Add(new HandleErrorAttribute());
3. Adım - Denetleyiciyi eylem yöntemleriyle oluşturun
Şimdi iki eylem yöntemiyle bir kontrolör ekliyoruz ...
public class ErrorController : Controller
{
public ActionResult NotFound()
{
Response.StatusCode = (int)HttpStatusCode.NotFound;
return View();
}
public ActionResult ServerError()
{
Response.StatusCode = (int)HttpStatusCode.InternalServerError;
// Todo: Pass the exception into the view model, which you can make.
// That's an exercise, dear reader, for -you-.
// In case u want to pass it to the view, if you're admin, etc.
// if (User.IsAdmin) // <-- I just made that up :) U get the idea...
// {
// var exception = Server.GetLastError();
// // etc..
// }
return View();
}
// Shhh .. secret test method .. ooOOooOooOOOooohhhhhhhh
public ActionResult ThrowError()
{
throw new NotImplementedException("Pew ^ Pew");
}
}
Tamam, bir bakalım. Her şeyden önce, burada hiçbir [HandleError]
özellik yoktur. Neden? Yerleşik ASP.NET
çerçeve zaten hataları işlediğinden ve bir hatayı işlemek için yapmamız gereken her şeyi belirttik :) Bu yöntemde!
Sonra, iki eylem yöntemim var. Orada zor bir şey yok. Herhangi bir istisna bilgisi göstermek istiyorsanız, o Server.GetLastError()
bilgiyi almak için kullanabilirsiniz .
Bonus WTF: Evet, hata işlemeyi test etmek için üçüncü bir işlem yöntemi yaptım.
4. Adım - Görünümleri Oluşturma
Ve son olarak, iki görünüm oluşturun. Bu denetleyici için onları normal görüntüleme noktasına koyun.
Bonus yorumları
- İhtiyacın yok
Application_Error(object sender, EventArgs e)
- Yukarıdaki adımların hepsi Elmah ile% 100 mükemmel çalışır . Elmah kırma wroxs!
Ve bu, dostlarım, olmalı.
Şimdi, bu kadar okumak için tebrikler ve ödül olarak bir Unicorn var!