Jawaban Cepat / TL; DR
Untuk orang-orang malas di luar sana:
Install-Package MagicalUnicornMvcErrorToolkit -Version 1.0
Kemudian hapus baris ini dari global.asax
GlobalFilters.Filters.Add(new HandleErrorAttribute());
Dan ini hanya untuk IIS7 + dan IIS Express.
Jika Anda menggunakan Cassini .. well .. um .. er .. canggung ...
Panjang, jawaban yang dijelaskan
Saya tahu ini telah dijawab. Tetapi jawabannya SANGAT SEDERHANA (sorakan kepada David Fowler dan Damian Edwards untuk benar-benar menjawab ini).
Tidak perlu melakukan kebiasaan apa pun .
Untuk ASP.NET MVC3
, semua potongan ada di sana.
Langkah 1 -> Perbarui web.config Anda di DUA tempat.
<system.web>
<customErrors mode="On" defaultRedirect="/ServerError">
<error statusCode="404" redirect="/NotFound" />
</customErrors>
dan
<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>
Sekarang perhatikan ROUTES yang telah saya putuskan untuk digunakan. Anda dapat menggunakan apa saja, tetapi rute saya
/NotFound
<- untuk halaman 404 tidak ditemukan, halaman kesalahan.
/ServerError
<- untuk kesalahan lain, sertakan kesalahan yang terjadi pada kode saya. ini adalah 500 Server Internal Kesalahan
Lihat bagaimana bagian pertama <system.web>
hanya memiliki satu entri khusus? The statusCode="404"
entri? Saya hanya mencantumkan satu kode status karena semua kesalahan lainnya, termasuk 500 Server Error
(mis. Kesalahan sial yang terjadi ketika kode Anda memiliki bug dan crash permintaan pengguna) .. semua kesalahan lainnya ditangani oleh pengaturan defaultRedirect="/ServerError"
.. yang mengatakan , jika Anda bukan halaman 404 tidak ditemukan, maka silakan kebagian rute /ServerError
.
Baik. itu keluar dari jalan .. sekarang ke rute saya terdaftar diglobal.asax
Langkah 2 - Membuat rute di Global.asax
Inilah bagian rute lengkap saya ..
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}
);
}
Itu mencantumkan dua rute abaikan -> axd's
dan favicons
(ooo! Bonus abaikan rute, untuk Anda!) Lalu (dan urutannya IMPERATIF DI SINI), saya memiliki dua rute penanganan kesalahan yang eksplisit .. diikuti oleh rute lainnya. Dalam hal ini, yang standar. Tentu saja, saya punya lebih banyak, tetapi itu khusus untuk situs web saya. Pastikan rute kesalahan ada di bagian atas daftar. Ketertiban sangat penting .
Akhirnya, sementara kita berada di dalam kita global.asax
file kita, kita TIDAK mendaftarkan atribut HandleError secara global. Tidak, tidak, tidak, tuan. Nadda. Nggak. Nien. Negatif. Tidaaaaaak ...
Hapus baris ini dari global.asax
GlobalFilters.Filters.Add(new HandleErrorAttribute());
Langkah 3 - Buat controller dengan metode tindakan
Sekarang .. kita tambahkan controller dengan dua metode aksi ...
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");
}
}
Ok, mari kita periksa ini. Pertama-tama, tidak ada [HandleError]
atribut di sini. Mengapa? Karena built inASP.NET
kerangka kerja bawaan sudah menangani kesalahan DAN kami telah menentukan semua omong kosong yang perlu kami lakukan untuk menangani kesalahan :) Ada dalam metode ini!
Selanjutnya, saya memiliki dua metode tindakan. Tidak ada yang sulit di sana. Jika Anda ingin menampilkan info pengecualian, maka Anda dapat menggunakannya Server.GetLastError()
untuk mendapatkan info itu.
Bonus WTF: Ya, saya membuat metode tindakan ketiga, untuk menguji penanganan kesalahan.
Langkah 4 - Buat Views
Dan akhirnya, buat dua tampilan. Tempatkan mereka di tempat tampilan normal, untuk pengontrol ini.
Komentar bonus
- Anda tidak membutuhkan
Application_Error(object sender, EventArgs e)
- Langkah-langkah di atas semuanya bekerja 100% sempurna dengan Elmah . Elmah memalsukan wrox!
Dan itu, teman-teman saya, seharusnya begitu.
Sekarang, selamat telah membaca sebanyak ini dan dapatkan Unicorn sebagai hadiah!