Saya ingin halaman kesalahan khusus ditampilkan untuk 500, 404 dan 403. Inilah yang telah saya lakukan:
Mengaktifkan kesalahan khusus di web.config sebagai berikut:
<customErrors mode="On" defaultRedirect="~/Views/Shared/Error.cshtml"> <error statusCode="403" redirect="~/Views/Shared/UnauthorizedAccess.cshtml" /> <error statusCode="404" redirect="~/Views/Shared/FileNotFound.cshtml" /> </customErrors>
Terdaftar
HandleErrorAttribute
sebagai filter tindakan global diFilterConfig
kelas sebagai berikut:public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new CustomHandleErrorAttribute()); filters.Add(new AuthorizeAttribute()); }
Membuat halaman kesalahan khusus untuk masing-masing pesan di atas. Yang standar untuk 500 sudah tersedia di luar kotak.
Dinyatakan dalam setiap tampilan halaman kesalahan kustom bahwa model untuk halaman tersebut
System.Web.Mvc.HandleErrorInfo
Untuk 500, ini menunjukkan halaman kesalahan khusus. Bagi yang lain, tidak.
Apakah ada sesuatu yang saya lewatkan?
Memang terlihat seperti ini tidak semua ada untuk menampilkan kesalahan khusus ketika saya membaca kode dalam OnException
metode HandleErrorAttribute
kelas dan hanya menangani 500.
Apa yang harus saya lakukan untuk menangani kesalahan lain?
sumber
Jawaban:
Pengaturan saya saat ini (pada MVC3, tapi saya pikir itu masih berlaku) bergantung pada memiliki
ErrorController
, jadi saya menggunakan:Dan controller berisi yang berikut ini:
Dan pandangan seperti cara Anda menerapkannya. Saya cenderung menambahkan sedikit logika, untuk menunjukkan jejak stack dan informasi kesalahan jika aplikasi dalam mode debug. Jadi Error.cshtml terlihat seperti ini:
sumber
redirectMode="ResponseRewrite"
padaCustomerErrors
elemen//you may want to set this to 200
dalam kode. JANGAN LAKUKAN ITU!Saya sudah melakukan solusi pablo dan saya selalu mengalami kesalahan (MVC4)
Untuk menghilangkan ini, hapus baris
di FilterConfig.cs
sumber
Saya melakukan sesuatu yang membutuhkan pengkodean lebih sedikit daripada solusi lain yang diposting.
Pertama, di web.config saya, saya memiliki yang berikut:
Dan controller (/Controllers/ErrorPageController.cs) berisi yang berikut ini:
Dan akhirnya, tampilan berisi hal-hal berikut (dilucuti untuk kesederhanaan, tetapi dapat bertentangan:
Sesederhana itu. Itu bisa dengan mudah diperluas untuk menawarkan info kesalahan yang lebih rinci, tetapi ELMAH menanganinya untuk saya & statusCode & statusDescription adalah semua yang biasanya saya butuhkan.
sumber
Tampaknya ada beberapa langkah di sini yang bercampur aduk. Saya akan mengedepankan apa yang saya lakukan dari awal.
Buat
ErrorPage
pengontrolTambahkan tampilan untuk dua tindakan ini (klik kanan -> Tambah Tampilan). Ini akan muncul di folder bernama ErrorPage.
Di dalam
App_Start
membukaFilterConfig.cs
dan berkomentar filter penanganan kesalahan.Di dalam web.config tambahkan
<customerErrors>
entri berikut , di bawahSystem.Web
Tes (tentu saja). Lempar pengecualian tidak tertangani dalam kode Anda dan lihat itu pergi ke halaman dengan id 500, dan kemudian gunakan URL ke halaman yang tidak ada untuk melihat 404.
sumber
An exception occurred while processing your request. Additionally, another exception occurred while executing the custom error page for the first exception. The request has been terminated.
Semua yang saya ambil dari kode Anda ada di file web.config, saya menambahkan<error redirect = "~/ControllerName/ActionName" statusCode="404"/>
dan berfungsi dengan baik :) Sisa kode berasal dari jawaban @ Pablo. Saya menggunakan MVC 5 dan kerangka kerja 6. Saya tidak menghapusfilters.Add(new HandleErrorAttribute())
dariFilterConfig.cs
Saya akan merekomendasikan untuk menggunakan File Global.asax.cs.
sumber
Membangun jawaban yang diposting oleh maxspan, saya telah mengumpulkan proyek sampel minimal di GitHub yang menunjukkan semua bagian yang berfungsi.
Pada dasarnya, kami hanya menambahkan
Application_Error
metode ke global.asax.cs untuk mencegat pengecualian dan memberi kami kesempatan untuk mengalihkan (atau lebih tepatnya, permintaan transfer ) ke halaman kesalahan khusus.Pengontrol Kesalahan:
Tampilan halaman kesalahan:
Tidak ada lagi yang terlibat, selain menonaktifkan / menghapus
filters.Add(new HandleErrorAttribute())
di FilterConfig.csMeskipun sangat sederhana untuk diterapkan, satu kelemahan yang saya lihat dalam pendekatan ini adalah menggunakan querystring untuk mengirimkan informasi pengecualian ke halaman kesalahan target.
sumber
Saya sudah mengatur semuanya, tetapi masih tidak bisa melihat halaman kesalahan yang tepat untuk kode status 500 di server pementasan kami, meskipun semuanya berjalan baik di server pengembangan lokal.
Saya menemukan posting blog ini dari Rick Strahl yang membantu saya.
Saya perlu menambahkan
Response.TrySkipIisCustomErrors = true;
kode penanganan kesalahan khusus saya.sumber
Ini solusinya. Gunakan [ExportModelStateToTempData] / [ImportModelStateFromTempData] tidak nyaman menurut saya.
~ / Views / Home / Error.cshtml:
~ / Controllers / HomeController.sc:
~ / Controllers / BaseController.sc:
~ / Controllers / MyController.sc:
Saya berharap Anda berhasil proyek ;-)
sumber
Anda bisa mendapatkan kesalahan berfungsi dengan benar tanpa meretas global.cs, mengacaukan HandleErrorAttribute, melakukan Response.TrySkipIisCustomErrors, menghubungkan Application_Error, atau apa pun:
Di system.web (seperti biasa, hidup / mati)
dan di system.webServer
Sekarang semuanya harus berjalan seperti yang diharapkan, dan Anda dapat menggunakan ErrorController untuk menampilkan apa pun yang Anda butuhkan.
sumber
Sepertinya saya datang terlambat ke pesta, tetapi Anda harus memeriksa ini juga.
Jadi
system.web
untuk caching pengecualian dalam aplikasi seperti return HttpNotFound ()dan
system.webServer
untuk menangkap kesalahan yang ditangkap oleh IIS dan tidak membuat jalan mereka ke kerangka asp.netDi yang terakhir jika Anda khawatir tentang respons klien kemudian ubah
responseMode="Redirect"
toresponseMode="File"
dan sajikan file html statis, karena yang ini akan menampilkan halaman ramah dengan 200 kode respons.sumber
Di web.config tambahkan ini di bawah tag system.webserver seperti di bawah ini,
dan tambahkan pengontrol sebagai,
dan menambahkan pandangan mereka yang dihormati, ini pasti akan berhasil kurasa untuk semua.
Solusi ini saya temukan dari: Neptunus Century
sumber