Saya mencoba menggunakan ELMAH untuk mencatat kesalahan dalam aplikasi ASP.NET MVC saya, namun ketika saya menggunakan atribut [HandleError] pada pengontrol saya, ELMAH tidak mencatat kesalahan apa pun ketika terjadi.
Seperti yang saya duga ini karena ELMAH hanya mencatat kesalahan yang tidak tertangani dan atribut [HandleError] menangani kesalahan sehingga tidak perlu untuk mencatatnya.
Bagaimana cara saya memodifikasi atau bagaimana saya akan memodifikasi atribut sehingga ELMAH dapat mengetahui bahwa ada kesalahan dan mencatatnya ..
Sunting: Biarkan saya memastikan semua orang mengerti, saya tahu saya bisa memodifikasi atribut itu bukan pertanyaan yang saya tanyakan ... ELMAH dilewati ketika menggunakan atribut handleerror yang berarti tidak akan melihat bahwa ada kesalahan karena ditangani sudah berdasarkan atribut ... Apa yang saya minta adalah ada cara untuk membuat ELMAH melihat kesalahan dan mencatatnya meskipun atribut menanganinya ... Saya mencari-cari dan tidak melihat metode apa pun untuk memanggil untuk memaksa untuk login kesalahan ....
sumber
Jawaban:
Anda dapat subkelas
HandleErrorAttribute
dan menimpaOnException
anggotanya (tidak perlu menyalin) sehingga ia mencatat pengecualian dengan ELMAH dan hanya jika implementasi basis menanganinya. Jumlah minimal kode yang Anda butuhkan adalah sebagai berikut:Implementasi basis dipanggil terlebih dahulu, memberikannya kesempatan untuk menandai pengecualian yang sedang ditangani. Hanya saat itulah pengecualian diisyaratkan. Kode di atas sederhana dan dapat menyebabkan masalah jika digunakan di lingkungan di mana
HttpContext
mungkin tidak tersedia, seperti pengujian. Akibatnya, Anda akan menginginkan kode yang lebih defensif (dengan biaya sedikit lebih lama):Versi kedua ini akan mencoba menggunakan pensinyalan kesalahan dari ELMAH terlebih dahulu, yang melibatkan pipa yang sepenuhnya dikonfigurasi seperti pencatatan, pengiriman surat, pemfilteran, dan apa yang Anda miliki. Gagal itu, ia mencoba untuk melihat apakah kesalahan harus disaring. Jika tidak, kesalahan hanya dicatat. Implementasi ini tidak menangani notifikasi surat. Jika pengecualian dapat ditandai maka email akan dikirim jika dikonfigurasi untuk melakukannya.
Anda mungkin juga harus berhati-hati bahwa jika beberapa
HandleErrorAttribute
instance berlaku maka duplikat logging tidak terjadi, tetapi dua contoh di atas harus memulai.sumber
Maaf, tapi saya pikir jawaban yang diterima adalah berlebihan. Yang perlu Anda lakukan adalah ini:
dan kemudian daftarkan (urutan penting) di Global.asax.cs:
sumber
HandleErrorAttribute
, tidak perlu menimpaOnException
padaBaseController
. Ini kira jawaban yang diterima.new UnhandledLoggedException(Exception thrown)
yang menambahkan sesuatuMessage
sebelum mengembalikannya.ElmahHandledErrorLoggerFilter()
elmah hanya mencatat kesalahan yang tidak ditangani, tetapi tidak ditangani. Saya mendaftarkan filter dengan urutan yang benar ketika Anda menyebutkan itu, ada pemikiran?Sekarang ada paket ELMAH.MVC di NuGet yang mencakup solusi yang ditingkatkan oleh Atif dan juga pengontrol yang menangani antarmuka elmah dalam perutean MVC (tidak perlu menggunakan axd itu lagi)
Masalah dengan solusi itu (dan dengan semua yang ada di sini) ) adalah bahwa salah satu cara penangan kesalahan elmah sebenarnya menangani kesalahan, mengabaikan apa yang mungkin ingin Anda atur sebagai tag customError atau melalui ErrorHandler atau penangan kesalahan Anda sendiri
Solusi terbaik IMHO adalah membuat filter yang akan bertindak di akhir semua filter lain dan mencatat peristiwa yang sudah ditangani. Modul elmah harus berhati-hati dalam mencatat kesalahan lain yang tidak ditangani oleh aplikasi. Ini juga akan memungkinkan Anda untuk menggunakan monitor kesehatan dan semua modul lain yang dapat ditambahkan ke asp.net untuk melihat peristiwa kesalahan
Saya menulis ini dengan reflektor di ErrorHandler di dalam elmah.mvc
Sekarang, dalam konfigurasi filter Anda, Anda ingin melakukan sesuatu seperti ini:
Perhatikan bahwa saya meninggalkan komentar di sana untuk mengingatkan orang bahwa jika mereka ingin menambahkan filter global yang benar-benar akan menangani pengecualian itu harus pergi SEBELUM filter terakhir ini, jika tidak Anda mengalami kasus di mana pengecualian yang tidak ditangani akan diabaikan oleh ElmahMVCErrorFilter karena itu belum ditangani dan harus dicatat oleh modul Elmah tetapi kemudian filter berikutnya menandai pengecualian sebagai ditangani dan modul mengabaikannya, sehingga pengecualian tidak pernah membuatnya menjadi elmah.
Sekarang, pastikan pengaturan aplikasi untuk elmah di konfigurasi web Anda terlihat seperti ini:
Yang penting di sini adalah "elmah.mvc.disableHandleErrorFilter", jika ini salah, ia akan menggunakan handler di dalam elmah.mvc yang benar-benar akan menangani pengecualian dengan menggunakan HandleErrorHandler default yang akan mengabaikan pengaturan customError Anda
Setup ini memungkinkan Anda untuk mengatur tag ErrorHandler Anda sendiri di kelas dan tampilan, sambil tetap mencatat kesalahan tersebut melalui ElmahMVCErrorFilter, menambahkan konfigurasi customError ke web Anda. Mengkonfigurasi melalui modul elmah, bahkan menulis Error Handler Anda sendiri. Satu-satunya hal yang perlu Anda lakukan adalah ingat untuk tidak menambahkan filter yang benar-benar akan menangani kesalahan sebelum filter elmah yang telah kami tulis. Dan saya lupa menyebutkan: tidak ada duplikat di elmah.
sumber
Anda dapat mengambil kode di atas dan melangkah lebih jauh dengan memperkenalkan pabrik pengontrol khusus yang menyuntikkan atribut HandleErrorWithElmah ke setiap pengontrol.
Untuk informasi lebih lanjut, lihat seri blog saya tentang login di MVC. Artikel pertama mencakup bagaimana mengatur dan menjalankan Elmah untuk MVC.
Ada tautan ke kode yang dapat diunduh di akhir artikel. Semoga itu bisa membantu.
http://dotnetdarren.wordpress.com/
sumber
Saya baru di ASP.NET MVC. Saya menghadapi masalah yang sama, berikut ini adalah yang bisa diterapkan di Erorr.vbhtml saya (berfungsi jika Anda hanya perlu mencatat kesalahan menggunakan Elmah log)
Itu sederhana!
sumber
Solusi yang sepenuhnya alternatif adalah dengan tidak menggunakan MVC
HandleErrorAttribute
, dan sebaliknya mengandalkan penanganan kesalahan ASP.Net, yang dirancang untuk bekerja dengan Elmah.Anda perlu menghapus global default
HandleErrorAttribute
dari App_Start \ FilterConfig (atau Global.asax), dan kemudian mengatur halaman kesalahan di Web.config Anda:Catatan, ini bisa berupa URL yang dirutekan MVC, sehingga hal di atas akan mengarahkan ulang ke
ErrorController.Index
tindakan saat terjadi kesalahan.sumber
Bagi saya itu sangat penting untuk membuat logging email berfungsi. Setelah beberapa waktu saya menemukan bahwa ini hanya membutuhkan 2 baris kode lebih dalam contoh Atif.
Saya harap ini akan membantu seseorang :)
sumber
Inilah yang saya butuhkan untuk konfigurasi situs MVC saya!
Saya menambahkan sedikit modifikasi pada
OnException
metode untuk menangani banyakHandleErrorAttribute
kejadian, seperti yang disarankan oleh Atif Aziz:Saya cukup memeriksa
context.ExceptionHandled
sebelum memanggil kelas dasar, hanya untuk mengetahui apakah ada orang lain yang menangani pengecualian sebelum penangan saat ini.Ini bekerja untuk saya dan saya memposting kode kalau-kalau ada orang lain yang membutuhkannya dan bertanya apakah ada yang tahu jika saya mengabaikan sesuatu.
Semoga bermanfaat:
sumber