Artikel KB ini mengatakan bahwa ASP.NET Response.End()membatalkan utas.
Reflektor menunjukkan bahwa tampilannya seperti ini:
public void End()
{
if (this._context.IsInCancellablePeriod)
{
InternalSecurityPermissions.ControlThread.Assert();
Thread.CurrentThread.Abort(new HttpApplication.CancelModuleException(false));
}
else if (!this._flushing)
{
this.Flush();
this._ended = true;
if (this._context.ApplicationInstance != null)
{
this._context.ApplicationInstance.CompleteRequest();
}
}
}
Bagi saya ini agak kasar. Seperti yang dikatakan artikel KB, kode apa pun dalam aplikasi berikut Response.End()ini tidak akan dieksekusi, dan itu melanggar prinsip paling tidak heran. Ini hampir seperti Application.Exit()di aplikasi WinForms. Pengecualian utas dibatalkan yang disebabkan oleh Response.End()tidak dapat ditangkap, jadi mengelilingi kode dalam try... finallytidak akan memuaskan.
Itu membuat saya bertanya-tanya apakah saya harus selalu menghindari Response.End().
Adakah yang bisa menyarankan, kapan saya harus menggunakan Response.End(), kapan Response.Close()dan kapan HttpContext.Current.ApplicationInstance.CompleteRequest()?
ref: entri blog Rick Strahl .
Berdasarkan input yang saya terima, jawaban saya adalah, Ya, Response.Endberbahaya , tetapi berguna dalam beberapa kasus terbatas.
- gunakan
Response.End()sebagai lemparan yang tidak dapat ditandingi, untuk segera mengakhiriHttpResponsedalam kondisi luar biasa. Dapat bermanfaat saat debugging juga. HindariResponse.End()untuk melengkapi respons rutin . - gunakan
Response.Close()untuk segera menutup koneksi dengan klien. Per posting blog MSDN ini , metode ini tidak dimaksudkan untuk pemrosesan permintaan HTTP normal. Sangat tidak mungkin Anda memiliki alasan yang bagus untuk memanggil metode ini. - gunakan
CompleteRequest()untuk mengakhiri permintaan normal.CompleteRequestmenyebabkan pipa ASP.NET melompat ke depan keEndRequestacara, setelahHttpApplicationacara saat ini selesai. Jadi, jika Anda meneleponCompleteRequest, maka tulis sesuatu lebih ke respons, tulis itu akan dikirim ke klien.
Edit - 13 April 2011
Kejelasan lebih lanjut tersedia di sini:
- Posting yang berguna di Blog MSDN
- Analisis yang berguna oleh Jon Reid
Response.Redirectdan Server.Transferkeduanya memanggil Response.Enddan juga harus dihindari.
Response.EndThreadAbortExceptionbaik-baik saja.