Saya memiliki halaman kesalahan kustom yang disiapkan untuk aplikasi saya:
<customErrors mode="On" defaultRedirect="~/errors/GeneralError.aspx"
/>
Di Global.asax, Application_Error (), kode berikut berfungsi untuk mendapatkan detail pengecualian:
Exception ex = Server.GetLastError();
if (ex != null)
{
if (ex.GetBaseException() != null)
ex = ex.GetBaseException();
}
Pada saat saya membuka halaman kesalahan saya (~ / error / GeneralError.aspx.cs), Server.GetLastError () adalah null
Adakah cara agar saya bisa mendapatkan detail pengecualian di Halaman Kesalahan, selain di Global.asax.cs?
ASP.NET 3.5 di Vista / IIS7
asp.net
exception
web-applications
custom-error-pages
nailitdown
sumber
sumber
Jawaban:
Melihat lebih dekat pengaturan web.config saya, salah satu komentar di posting ini sangat membantu
Jadi kita bisa mengubah
customErrors
untuk menambahkan parameter ini:yang
ResponseRewrite
mode memungkinkan kita untuk memuat «Kesalahan Halaman» tanpa mengarahkan browser, sehingga tetap URL yang sama, dan penting bagi saya, informasi pengecualian tidak hilang.sumber
UpdatePanel
s; halaman kesalahan tidak akan lagi ditampilkan.Oke, saya menemukan posting ini: http://msdn.microsoft.com/en-us/library/aa479319.aspx
dengan diagram yang sangat ilustratif ini:
(sumber: microsoft.com )
intinya, untuk mendapatkan detail pengecualian tersebut, saya perlu menyimpannya sendiri di Global.asax, untuk diambil nanti di halaman kesalahan kustom saya.
tampaknya cara terbaik adalah melakukan sebagian besar pekerjaan di Global.asax, dengan laman kesalahan khusus menangani konten yang bermanfaat daripada logika.
sumber
Kombinasi dari apa yang dikatakan NailItDown dan Victor. Cara yang disukai / termudah adalah dengan menggunakan Global.Asax Anda untuk menyimpan kesalahan dan kemudian mengarahkan ulang ke halaman kesalahan kustom Anda.
Global.asax :
Selain itu, Anda perlu menyiapkan web.config Anda :
Dan terakhir, lakukan apa pun yang Anda butuhkan dengan pengecualian yang telah Anda simpan di halaman kesalahan Anda :
sumber
Application[]
adalah objek global. Secara teoritis Anda bisa mengalami kondisi balapan di mana halaman kedua menimpa kesalahan. Namun, karenaSession[]
tidak selalu tersedia dalam kondisi kesalahan, saya rasa ini adalah pilihan yang lebih baik.Coba gunakan sesuatu seperti
Server.Transfer("~/ErrorPage.aspx");
dari dalamApplication_Error()
metode global.asax.csKemudian dari dalam
Page_Load()
ErrorPage.aspx.cs Anda akan baik-baik saja untuk melakukan sesuatu seperti:Exception exception = Server.GetLastError().GetBaseException();
Server.Transfer()
tampaknya menjaga pengecualian tetap ada.sumber
Server.Transfer
setelah halaman dirender setengah, maka HTML halaman yang Anda transfer akan digabungkan dengan apa pun yang telah dirender. Jadi Anda mungkin berakhir dengan setengah halaman rusak diikuti oleh halaman kesalahan di bawahnya.Meskipun ada beberapa jawaban yang bagus di sini, saya harus menunjukkan bahwa bukanlah praktik yang baik untuk menampilkan pesan pengecualian sistem pada halaman kesalahan (yang saya anggap Anda ingin lakukan). Anda mungkin secara tidak sengaja mengungkapkan hal-hal yang tidak ingin Anda lakukan kepada pengguna jahat. Misalnya pesan pengecualian Server Sql sangat bertele-tele dan dapat memberikan informasi nama pengguna, sandi, dan skema database saat terjadi kesalahan. Informasi itu tidak boleh ditampilkan kepada pengguna akhir.
sumber
Ini solusi saya ..
Di Global.aspx:
Di Oops.aspx:
sumber
Salah satu pertimbangan penting yang menurut saya tidak ada di sini adalah skenario load-balancing (web farm). Karena server yang menjalankan global.asax mungkin berbeda dari server yang mengeksekusi laman kesalahan khusus, menyembunyikan objek pengecualian di Aplikasi tidak dapat diandalkan.
Saya masih mencari solusi yang dapat diandalkan untuk masalah ini dalam konfigurasi web farm, dan / atau penjelasan yang baik dari MS tentang mengapa Anda tidak dapat mengambil pengecualian dengan Server.GetLastError di halaman kesalahan khusus seperti Anda bisa di global.asax Application_Error.
PS Tidak aman menyimpan data dalam koleksi Aplikasi tanpa menguncinya terlebih dahulu, lalu membukanya.
sumber
Ini terkait dengan 2 topik di bawah ini, saya ingin mendapatkan GetHtmlErrorMessage dan Session pada halaman Error.
Sesi menjadi nol setelah ResponseRewrite
Mengapa HttpContext.Session null saat redirectMode = ResponseRewrite
Saya mencoba dan melihat solusi yang tidak perlu
Server.Transfer() or Response.Redirect()
Pertama: hapus ResponseRewrite di web.config
Web.config
Lalu Global.asax
Lalu errorHandler.aspx.cs
Untuk referensi
http://www.developer.com/net/asp/article.php/3299641/ServerTransfer-Vs-ResponseRedirect.htm
sumber
Itu berhasil untuk saya. di MVC 5
di
~\Global.asax
di
~\Controllers
BuatErrorController.cs
di
~\Models
BuatFunctionTools.cs
di
~\Views
Buat FolderError
dan di~\Views\Error
BuatError.cshtml
Jika Anda memasukkan alamat ini
localhost/Error
Dan jika terjadi kesalahan
Sebagai pengganti untuk menampilkan kesalahan, variabel 'log' disimpan dalam database
sumber
Saya pikir Anda memiliki beberapa opsi di sini.
Anda bisa menyimpan Pengecualian terakhir di Sesi dan mengambilnya dari halaman kesalahan kustom Anda; atau Anda bisa mengarahkan ulang ke halaman kesalahan kustom Anda dalam acara Application_error. Jika Anda memilih yang terakhir, Anda ingin memastikan Anda menggunakan metode Server.Transfer.
sumber