บทความ KB นี้บอกว่า ASP.NET Response.End()
ยกเลิกการใช้เธรด
Reflector แสดงให้เห็นว่ามันเป็นเช่นนี้:
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();
}
}
}
มันช่างโหดร้ายเหลือเกินสำหรับฉัน ดังที่บทความ KB กล่าวว่าโค้ดใด ๆ ในแอปพลิเคชันต่อไปนี้Response.End()
จะไม่ถูกประมวลผลและที่ละเมิดหลักการของความประหลาดใจอย่างน้อยที่สุด มันเกือบจะเหมือนApplication.Exit()
ในแอพ WinForms ข้อยกเว้นการยกเลิกเธรดที่เกิดจากResponse.End()
ไม่สามารถจับได้ดังนั้นการล้อมรอบโค้ดในtry
... finally
จะไม่เป็นไปตาม
Response.End()
มันทำให้ฉันสงสัยว่าฉันควรหลีกเลี่ยง
ใครสามารถแนะนำฉันควรใช้Response.End()
เมื่อใดResponse.Close()
และเมื่อไหร่HttpContext.Current.ApplicationInstance.CompleteRequest()
?
จากคำตอบที่ฉันได้รับคำตอบของฉันคือใช่Response.End
เป็นอันตรายแต่มีประโยชน์ในบางกรณี
- ใช้
Response.End()
เป็นการโยนที่ไม่สามารถจับตาดูได้เพื่อยุติHttpResponse
เงื่อนไขพิเศษทันที จะมีประโยชน์ในระหว่างการดีบักด้วย หลีกเลี่ยงResponse.End()
การตอบประจำสมบูรณ์ - ใช้
Response.Close()
เพื่อปิดการเชื่อมต่อกับไคลเอนต์ทันที สำหรับการโพสต์บล็อก MSDNนี้วิธีนี้ไม่ได้มีไว้สำหรับการประมวลผลคำขอ HTTP ปกติ ไม่น่าเป็นไปได้สูงที่คุณจะมีเหตุผลที่ดีที่จะเรียกวิธีนี้ - ใช้
CompleteRequest()
เพื่อยุติการคำขอปกติCompleteRequest
ทำให้ไปป์ไลน์ ASP.NET เพื่อข้ามไปข้างหน้ากับEndRequest
เหตุการณ์หลังจากHttpApplication
เหตุการณ์ปัจจุบันเสร็จสมบูรณ์ ดังนั้นถ้าคุณโทรCompleteRequest
แล้วเขียนอะไรมากกว่านี้เพื่อตอบสนองการเขียนจะถูกส่งไปยังลูกค้า
แก้ไข - 13 เมษายน 2554
ความชัดเจนเพิ่มเติมมีอยู่ที่นี่:
- โพสต์ที่เป็นประโยชน์ในบล็อก MSDN
- การวิเคราะห์ที่เป็นประโยชน์โดย Jon Reid
Response.Redirect
และServer.Transfer
เรียกร้องทั้งสองResponse.End
และควรหลีกเลี่ยง
Response.End
ThreadAbortException
ก็เข้าใจได้ดี