Ketika saya menggunakan Response.Redirect (...) untuk mengarahkan ulang formulir saya ke halaman baru, saya mendapatkan kesalahan:
Pengecualian kesempatan pertama dari tipe 'System.Threading.ThreadAbortException' terjadi di mscorlib.dll
. Pengecualian dari tipe 'System.Threading.ThreadAbortException' terjadi di mscorlib.dll tetapi tidak ditangani dalam kode pengguna
Pemahaman saya tentang hal ini adalah bahwa kesalahan disebabkan oleh server web membatalkan sisa halaman response.redirect dipanggil.
Saya tahu saya bisa menambahkan parameter kedua ke Response.Redirect
yang disebut endResponse. Jika saya mengatur endResponse ke True saya masih mendapatkan kesalahan tetapi jika saya mengaturnya ke False maka saya tidak melakukannya. Saya cukup yakin meskipun itu berarti server web menjalankan sisa halaman yang saya arahkan kembali. Yang tampaknya tidak efisien untuk sedikitnya. Apakah ada cara yang lebih baik untuk melakukan ini? Sesuatu selainResponse.Redirect
atau apakah ada cara untuk memaksa halaman lama berhenti memuat di mana saya tidak akan mendapatkan ThreadAbortException
?
Context.ApplicationInstance.CompleteRequest();
. Mengapa? Apakah saya harusreturn
dari pengatur acara bersyarat?The old version of Redirect
frasa yang Anda gunakan dalam komentar Anda, tidak seperti MS mengubah implementasinya, itu hanya kelebihan lain.Tidak ada solusi sederhana dan elegan untuk
Redirect
masalah di ASP.Net WebForms. Anda dapat memilih antara solusi Kotor dan solusi TediousKotor :
Response.Redirect(url)
mengirimkan pengalihan ke browser, dan kemudian melemparThreadAbortedException
untuk mengakhiri utas saat ini. Jadi tidak ada kode yang dieksekusi melewati Redirect () - panggilan. Kelemahan: Ini adalah praktik yang buruk dan memiliki implikasi kinerja untuk membunuh utas seperti ini. Juga,ThreadAbortedExceptions
akan muncul dalam pengecualian logging.Menjemukan : Cara yang disarankan adalah menelepon
Response.Redirect(url, false)
dan kemudianContext.ApplicationInstance.CompleteRequest()
Namun, eksekusi kode akan berlanjut dan sisa penangan acara di siklus hidup halaman masih akan dieksekusi. (Misalnya, jika Anda melakukan pengalihan di Page_Load, tidak hanya sisa handler akan dieksekusi, Page_PreRender dan seterusnya juga akan dipanggil - halaman yang diberikan tidak akan dikirim ke browser. Anda dapat menghindari pemrosesan tambahan dengan mis. mengatur bendera pada halaman, dan kemudian biarkan penangan acara berikutnya memeriksa bendera ini sebelum sebelum melakukan pemrosesan.(Dokumentasi
CompleteRequest
menyatakan bahwa hal itu " Menyebabkan ASP.NET memintas semua peristiwa dan memfilter dalam rantai eksekusi HTTP ". Ini dapat dengan mudah disalahpahami. Ia mem-bypass filter dan modul HTTP lebih lanjut, tetapi tidak mem-bypass peristiwa lebih lanjut dalam siklus hidup halaman saat ini .)Masalah yang lebih dalam adalah bahwa WebForms tidak memiliki tingkat abstraksi. Ketika Anda berada dalam event handler, Anda sudah dalam proses membangun halaman untuk menghasilkan. Mengarahkan dalam pengendali acara adalah jelek karena Anda mengakhiri halaman yang dibuat sebagian untuk menghasilkan halaman yang berbeda. MVC tidak memiliki masalah ini karena aliran kontrol terpisah dari tampilan rendering, sehingga Anda dapat melakukan redirect bersih dengan hanya mengembalikan a
RedirectAction
di controller, tanpa menghasilkan tampilan.sumber
Saya tahu saya terlambat, tetapi saya hanya pernah memiliki kesalahan ini jika saya
Response.Redirect
ada diTry...Catch
blok.Jangan pernah berikan Response.Redirect ke blok Coba ... Tangkap. Ini praktik buruk
Edit
Menanggapi komentar @ Kiquenet, inilah yang akan saya lakukan sebagai alternatif untuk meletakkan Response.Redirect ke blok Try ... Catch.
Saya akan memecah metode / fungsi menjadi dua langkah.
Langkah satu di dalam blok Coba ... Tangkap melakukan tindakan yang diminta dan menetapkan nilai "hasil" untuk menunjukkan keberhasilan atau kegagalan tindakan.
Langkah dua di luar blok Coba ... Tangkapan melakukan pengalihan (atau tidak) tergantung pada apa nilai "hasil".
Kode ini jauh dari sempurna dan mungkin tidak boleh disalin karena saya belum mengujinya
sumber
Response.Redirect()
melempar pengecualian untuk membatalkan permintaan saat ini.Ini artikel KB menjelaskan perilaku ini (juga untuk
Request.End()
danServer.Transfer()
metode).Karena
Response.Redirect()
ada kelebihan:Jika Anda meneruskan endResponse = false , maka pengecualian tidak dilempar (tetapi runtime akan melanjutkan pemrosesan permintaan saat ini).
Jika endResponse = true (atau jika kelebihan lainnya digunakan), pengecualian dilemparkan dan permintaan saat ini akan segera dihentikan.
sumber
Inilah baris resmi untuk masalah ini (saya tidak dapat menemukan yang terbaru, tetapi saya tidak berpikir situasinya telah berubah untuk versi .net yang lebih baru)
sumber
I think that links are fantastic, but they should never be the only piece of information in your answer.
Beginilah cara
Response.Redirect(url, true)
kerjanya. Itu melemparThreadAbortException
untuk membatalkan utas. Abaikan saja pengecualian itu. (Saya kira itu adalah beberapa penangan kesalahan global / logger di mana Anda melihatnya?)Diskusi terkait yang menarik Apakah
Response.End()
Dianggap Berbahaya? .sumber
Saya juga mencoba solusi lain, tetapi beberapa kode dieksekusi setelah redirect.
Jadi jika perlu mencegah eksekusi kode setelah redirect
sumber
saya bahkan mencoba untuk menghindari ini, kalau-kalau melakukan Abort pada utas secara manual, tetapi saya lebih suka meninggalkannya dengan "CompleteRequest" dan melanjutkan - kode saya telah mengembalikan perintah setelah pengalihan. Jadi ini bisa dilakukan
sumber
Apa yang saya lakukan adalah menangkap pengecualian ini, bersama dengan kemungkinan pengecualian lain. Semoga ini bisa membantu seseorang.
sumber
Saya juga punya masalah itu.
Coba gunakan
Server.Transfer
sebagai gantiResponse.Redirect
Bekerja untukku.
sumber