Proses melakukan penanganan kesalahan kustom di ASP.NET MVC (3 dalam kasus ini) tampaknya sangat diabaikan. Saya telah membaca berbagai pertanyaan dan jawaban di sini, di web, halaman bantuan untuk berbagai alat (seperti Elmah), tetapi saya merasa seperti saya telah berada dalam lingkaran yang lengkap dan masih belum memiliki solusi terbaik. Dengan bantuan Anda, mungkin kami dapat menetapkan pendekatan standar baru untuk penanganan kesalahan. Saya ingin menjaga hal-hal sederhana dan tidak over-engineer ini.
Inilah tujuan saya:
Untuk kesalahan / pengecualian Server:
- Tampilkan informasi debug di dev
- Tampilkan halaman kesalahan ramah dalam produksi
- Catat kesalahan dan kirimkan melalui email ke administrator dalam produksi
- Kembalikan 500 Kode Status HTTP
Untuk 404 Tidak Ditemukan kesalahan:
- Tampilkan halaman kesalahan ramah
- Catat kesalahan dan kirimkan melalui email ke administrator dalam produksi
- Kembalikan 404 Kode Status HTTP
Apakah ada cara untuk memenuhi tujuan ini dengan ASP.NET MVC?
Jawaban:
Saya akan membagikan cara saya akhirnya melakukan ini, itu adalah bagian dari pertanyaan awal.
Pertama, masalah yang saya temui:
Dengan customErrors pada (yaitu dalam produksi)
HandleError
atribut global menelan pengecualian dan membuat tampilan kesalahan Anda, tetapi kemudian Anda tidak dapat login dengan alat addon seperti elmah, karena elmah tidak pernah melihatnya. Anda bisa mencatatnya dalam pandangan Anda saya kira, tapi itu adalah pandangan, yang tampaknya salah. Atribut HandleError global muncul baru di templat proyek MVC 3 RTM Visual Studio.customErrors dengan url untuk titik akhir MVC menghasilkan 302 kode status. Ada properti redirectmode, tetapi Anda tidak dapat mencocokkan URL mvc di customErrors dan menggunakan mode ResponseRewrite. ( https://stackoverflow.com/questions/781861/customerrors-does-not-work-when-setting-redirectmode-responserewrite/3770265#3770265 )
Menghindari customErrors sepenuhnya dan menangani semua kustom di aplikasi Anda menyebabkan banyak kompleksitas, IMO. (Saya suka ini: https://stackoverflow.com/questions/619895/how-can-i-properly-handle-404s-in-asp-net-mvc/2577095#2577095 , tapi itu tidak cocok untuk proyek kami)
Solusi saya
Saya telah mengambil MVC sepenuhnya dari persamaan. Saya telah menghapus
HandleErrorAttribute
filter global di global.asax dan fokus sepenuhnya pada konfigurasi customErrors, menggesernya untuk menggunakan pengalihan WebForm dan mengubah ke redirectmodeResponseRewrite
untuk menghindari 302 kode respons HTTP.Kemudian, dalam
NotFound.aspx
event page_load, aturResponse.StatusCode
ke 404 dan di Error.aspx atur kode 500.Hasil:
Sasaran untuk keduanya telah dicapai dengan log Elmah, halaman kesalahan ramah, dan kode status dengan satu baris kode pada kode di belakang. Kami tidak melakukannya dengan "MVC Way" seperti solusi sebelumnya, tapi saya setuju dengan itu jika dua baris kode.
sumber
Saya pikir MVC, ASP, dan kerangka penanganan logging / pengecualian favorit Anda dapat menangani tujuan Anda dengan cukup baik. ELMAH dan Enterprise Library keduanya menyediakan penanganan pengecualian dan pencatatan yang mudah digunakan, jadi pilihlah favorit Anda .. Saya tidak akan membahas pro dan kontra dari masing-masing di sini.
CATATAN: Anda tidak dapat menampilkan halaman kesalahan yang ramah DAN mengembalikan HTTP 404 atau 500 seperti yang disarankan pertanyaan Anda. Saat Anda mengembalikan halaman kesalahan ramah, kode HTTP yang dikembalikan ke browser Anda adalah 302. Ini adalah pengalihan ke halaman kesalahan ramah.
Halaman Kesalahan Ramah
Sepertinya Anda dapat mencapai tujuan Anda dengan pengaturan web.config yang bagus yang telah menjadi bagian dari ASP.net selama beberapa waktu. Anda menyebutkan menunjukkan informasi debug ketika di dev dan menampilkan halaman ramah dalam produksi. Anda dapat menggunakan bagian kesalahan khusus web.config untuk ini (Setel CustomErrors = "Off" untuk menampilkan informasi debug). Saya akan menganggap bahwa Anda terbiasa dengan atribut CustomErrors, jika tidak membaca ini:
http://msdn.microsoft.com/en-us/library/h0hfz6fc.aspx
Jika Anda memerlukan granularity kontrol yang lebih besar atas tampilan kesalahan yang Anda tampilkan, maka gunakan HandleError Attribute MVC. Dengan cara ini Anda dapat memilih tampilan kesalahan yang berbeda untuk setiap Tindakan / Pengendali.
http://weblogs.asp.net/scottgu/archive/2008/07/14/asp-net-mvc-preview-4-release-part-1.aspx
Log Pengecualian
Sepertinya Anda ingin menanggapi semua pengecualian Anda dengan cara yang sama ('Kesalahan log dan kirim ke administrator dalam produksi'). Jika demikian, opsi paling sederhana Anda adalah menambahkan kode
Application_Error (pengirim objek, EventArgs e)
di global.asax Anda. Di sinilah Anda bisa menyampaikan kerangka logging yang Anda pilih.
Jika Anda ingin kontrol lebih besar atas penebangan / penanganan pengecualian Anda, maka Anda dapat mensubklasifikasikan HandleErrorAttribute dan menimpanya
ini adalah tempat lain di mana Anda bisa menyampaikan kerangka penebangan yang Anda pilih.
https://stackoverflow.com/questions/183316/asp-net-mvc-handleerror
Ini memberi Anda lebih banyak kontrol daripada teknik Application_Error yang disebutkan di atas.
Secara umum, MVC memberi Anda kendali besar tentang cara menangani kesalahan. Jika Anda tidak memerlukan kontrol ini maka Anda dapat kembali ke ASP.net cara melakukan hal-hal seperti mendefinisikan halaman kesalahan di web.config Anda.
sumber