Saya memiliki kode dalam peristiwa global.asax
file Application_Error
yang dijalankan ketika terjadi kesalahan dan mengirimkan detail kesalahan ke email saya sendiri.
void Application_Error(object sender, EventArgs e)
{
var error = Server.GetLastError();
if (error.Message != "Not Found")
{
// Send email here...
}
}
Ini berfungsi dengan baik ketika saya menjalankannya di Visual Studio, namun ketika saya menerbitkan ke server langsung kami Application_Error
acara tidak menyala.
Setelah beberapa pengujian, saya bisa mendapatkan Application_Error
pengaktifan saat saya menyetelnya customErrors="Off"
, namun menyetelnya kembali untuk customErrors="On"
menghentikan acara agar tidak diaktifkan lagi.
Adakah yang bisa menyarankan mengapa Application_Error
tidak akan menembak ketika customErrors
diaktifkan di web.config
?
asp.net-mvc-3
application-error
WDuffy
sumber
sumber
Application_Error()
metode tersebut tidak dipanggil. Saya juga menjelaskan solusi terakhir saya.Jawaban:
PEMBARUAN
Karena jawaban ini memang memberikan solusi, saya tidak akan mengeditnya, tetapi saya telah menemukan cara yang jauh lebih bersih untuk memecahkan masalah ini. Lihat jawaban saya yang lain untuk detailnya ...
Jawaban Asli:
Saya tahu mengapa
Application_Error()
metode ini tidak dipanggil ...Global.asax.cs
Secara default (saat proyek baru dibuat), aplikasi MVC memiliki beberapa logika di
Global.asax.cs
file. Logika ini digunakan untuk memetakan rute dan mendaftarkan filter. Secara default, ini hanya mendaftarkan satu filter:HandleErrorAttribute
filter. Saat customErrors aktif (atau melalui permintaan jarak jauh saat disetel ke RemoteOnly), HandleErrorAttribute memberi tahu MVC untuk mencari tampilan Error dan tidak pernah memanggilApplication_Error()
metode tersebut. Saya tidak dapat menemukan dokumentasi ini tetapi dijelaskan dalam jawaban ini di programmers.stackexchange.com .Untuk mendapatkan metode ApplicationError () yang dipanggil untuk setiap pengecualian yang tidak tertangani, cukup hapus baris yang mendaftarkan filter HandleErrorAttribute.
Sekarang masalahnya adalah: Bagaimana cara mengkonfigurasi customErrors untuk mendapatkan apa yang Anda inginkan ...
Secara default, bagian customErrors
redirectMode="ResponseRedirect"
. Anda juga dapat menentukan atribut defaultRedirect sebagai rute MVC. Saya membuat ErrorController yang sangat sederhana dan mengubah web.config saya agar terlihat seperti ini ...web.config
Masalah dengan solusi ini adalah bahwa ia 302 mengalihkan ke URL kesalahan Anda dan kemudian laman tersebut merespons dengan kode status 200. Hal ini menyebabkan Google mengindeks halaman kesalahan yang buruk. Ini juga tidak terlalu sesuai dengan spesifikasi HTTP. Yang ingin saya lakukan adalah tidak mengalihkan, dan menimpa tanggapan asli dengan tampilan kesalahan khusus saya.
Saya mencoba untuk berubah
redirectMode="ResponseRewrite"
. Sayangnya, opsi ini tidak mendukung rute MVC , hanya halaman HTML statis atau ASPX. Saya mencoba menggunakan halaman HTML statis pada awalnya tetapi kode respons masih 200 tetapi, setidaknya itu tidak mengarahkan. Saya kemudian mendapat ide dari jawaban ini ...Saya memutuskan untuk menyerah pada MVC karena penanganan kesalahan. Saya membuat
Error.aspx
dan aPageNotFound.aspx
. Halaman-halaman ini sangat sederhana tetapi memiliki satu keajaiban ...Blok ini memberi tahu halaman yang akan disajikan dengan kode status yang benar. Secara kasar, pada halaman PageNotFound.aspx, saya menggunakan
HttpStatusCode.NotFound
sebagai gantinya. Saya mengubah web.config saya agar terlihat seperti ini ...Semuanya bekerja dengan sempurna!
Ringkasan:
filters.Add(new HandleErrorAttribute());
Application_Error()
metode untuk mencatat pengecualianAda beberapa kelemahan yang saya perhatikan dengan solusi ini.
Ada solusi untuk masalah ini tetapi saya tidak cukup khawatir dengan mereka untuk melakukan pekerjaan tambahan.
Saya harap ini membantu semua orang!
sumber
<customErrors mode="Off" />
. Telahfilters.Add(new HandleErrorAttribute());
dihapus atau tidak ada efeknya.Saya menyelesaikan ini dengan membuat ExceptionFilter dan mencatat kesalahan di sana alih-alih Application_Error. Yang perlu Anda lakukan hanyalah menambahkan panggilan ke di RegisterGlobalFilters
log4netExceptionFilter.cs
Global.asax.cs
sumber
Saya menemukan artikel yang menjelaskan cara yang jauh lebih bersih untuk membuat halaman kesalahan kustom di aplikasi web MVC3 yang tidak mencegah kemampuan untuk mencatat pengecualian.
Solusinya adalah dengan menggunakan
<httpErrors>
elemen<system.webServer>
section.Saya mengkonfigurasi file Web.config seperti ini ...
Saya juga dikonfigurasi
customErrors
untuk memilikimode="Off"
(seperti yang disarankan oleh artikel).Itu membuat respons diganti dengan tindakan ErrorController. Ini pengontrolnya:
Tampilannya sangat lurus ke depan, saya hanya menggunakan sintaks Razor standar untuk membuat halaman.
Itu saja sudah cukup bagi Anda untuk menggunakan halaman kesalahan kustom dengan MVC.
Saya juga membutuhkan pencatatan Pengecualian jadi saya mencuri solusi Mark dengan menggunakan ExceptionFilter kustom ...
Hal terakhir yang perlu Anda lakukan adalah mendaftarkan Filter Pengecualian di file Global.asax.cs Anda :
Ini terasa seperti solusi yang jauh lebih bersih daripada jawaban saya sebelumnya dan bekerja sebaik yang saya tahu. Saya menyukainya terutama karena saya tidak merasa sedang berjuang melawan kerangka MVC; solusi ini benar-benar memanfaatkannya!
sumber
HTTP Error 500.0 - Internal Server Error The page cannot be displayed because an internal server error has occurred.
Layar kesalahan, bukan/Error/Index
halaman yang saya mintaTo able to overwrite global settings in global IIS settings (file: C:\Windows\System32\inetsrv\config \applicationHost.config) should be: <section name="httpErrors" overrideModeDefault="Allow" />
Dalam kasus ASP.NET MVC5 penggunaan
Anda dapat menemukannya di
FilterConfig.cs
dariApp_Start
folder.sumber
Saya suka jawaban Mark dengan ExceptionFilter, tetapi opsi lain, jika Anda memiliki semua pengontrol yang berasal dari pengontrol dasar yang sama, adalah dengan mengganti OnException di pengontrol dasar Anda. Anda dapat melakukan logging dan email di sana. Ini memiliki keuntungan untuk dapat menggunakan dependensi apa pun yang sudah Anda masukkan ke pengontrol dasar Anda dengan wadah IoC Anda.
Anda masih dapat menggunakan IoC Anda dengan IExceptionFilter, tetapi sedikit lebih rumit untuk mengonfigurasi binding Anda.
sumber
Sejauh yang saya tahu, Anda memberikan kontrol ke Halaman yang ditentukan dalam parameter url dan pemberitahuan peristiwa Anda akan duduk di sini, bukan Application_Error
Banyak informasi dapat ditemukan di sini: http://support.microsoft.com/kb/306355
sumber
Untuk mengatasi ini, saya akhirnya membiarkan kesalahan pelanggan dinonaktifkan dan menangani semua kesalahan dari acara Application_Error di global.asax. Ini sedikit rumit dengan MVC karena saya tidak ingin mengembalikan 301 redirect, saya ingin mengembalikan kode kesalahan yang sesuai. Lebih jelasnya dapat dilihat di blog saya di http://www.wduffy.co.uk/blog/using-application_error-in-asp-net-mvcs-global-asax-to-handle-errors/ tetapi kode akhirnya adalah tercantum di bawah ...
Dan inilah pengontrolnya
sumber
Response.StatusCode = ###;
, itu menunjukkan halaman kesalahan MVC built-in diC:\inetpub\custerr\en-US
. Saya juga tidak menyukai gagasan untuk memanggil HttpHandlers atau Controllers secara manual dari metode Application_Error () saya. Saya senang Anda menemukan solusi untuk masalah Anda, saya tahu sakit kepala seperti apa yang saya alami.Entri blog ini membantu saya:
http://asp-net.vexedlogic.com/2011/04/23/asp-net-maximum-request-length-exceeded/
Jika Anda menggunakan IIS 7.0 atau lebih tinggi, Anda dapat mengubah file Web.config Anda untuk menangani permintaan yang terlalu besar. Ada beberapa peringatan, tetapi berikut ini contohnya:
Ada detail tambahan tentang elemen file konfigurasi ini di sini:
http://www.iis.net/ConfigReference/system.webServer/security/requestFiltering/requestLimits
Kode status 404.13 didefinisikan sebagai "Panjang Isi Terlalu Besar". Satu hal penting untuk diperhatikan adalah bahwa
maxAllowedContentLength
ditentukan dalam byte. Ini berbeda darimaxRequestLength
pengaturan yang Anda temukan di<system.web>
bagian, yang ditentukan dalam kilobyte.Perhatikan juga bahwa
path
atribut harus berupa jalur absolut jikaresponseMode
adaRedirect
, jadi tambahkan nama direktori virtual, jika relevan. Jawaban informatif Jesse Webb menunjukkan bagaimana melakukan iniresponseMode="ExecuteURL"
, dan menurut saya pendekatan itu akan berhasil juga.Pendekatan ini tidak bekerja jika Anda mengembangkan menggunakan Visual Studio Development Server (Cassini, server Web yang terintegrasi ke dalam Visual Studio). Saya berasumsi ini akan berhasil di IIS Express, tetapi saya belum mengujinya.
sumber
Saya mengalami masalah yang sama di mana
Application_Error()
tidak tertabrak. Saya mencoba segalanya, sampai akhirnya saya melangkah melalui apa yang terjadi. Saya memiliki beberapa kode khusus dalam acara ELMAH yang menambahkan JSON ke email yang dikirimnya, dan ada kesalahan nol di sana!Memperbaiki kesalahan internal memungkinkan kode untuk melanjutkan ke
Application_Error()
acara seperti yang diharapkan.sumber