Điều KB này nói rằng ASP.NET Response.End()
hủy bỏ một chủ đề.
Reflector cho thấy nó trông như thế này:
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();
}
}
}
Điều này có vẻ khá khắc nghiệt với tôi. Như bài viết KB nói, bất kỳ mã nào trong ứng dụng sau đây Response.End()
sẽ không được thực thi và điều đó vi phạm nguyên tắc ít gây ngạc nhiên nhất. Nó gần giống như Application.Exit()
trong một ứng dụng WinForms. Ngoại lệ hủy bỏ luồng gây ra bởi Response.End()
không thể bắt được, vì vậy xung quanh mã trong try
... finally
sẽ không thỏa mãn.
Nó làm cho tôi tự hỏi nếu tôi luôn luôn nên tránh Response.End()
.
Bất cứ ai có thể đề nghị, khi nào tôi nên sử dụng Response.End()
, khi nào Response.Close()
và khi HttpContext.Current.ApplicationInstance.CompleteRequest()
nào?
ref: mục blog của Rick Strahl .
Dựa trên đầu vào tôi nhận được, câu trả lời của tôi là Có, Response.End
có hại , nhưng nó hữu ích trong một số trường hợp hạn chế.
- sử dụng
Response.End()
như một cú ném không thể so sánh, để chấm dứt ngay lập tứcHttpResponse
trong các điều kiện đặc biệt. Có thể hữu ích trong quá trình gỡ lỗi cũng. TránhResponse.End()
để hoàn thành các phản ứng thường xuyên . - sử dụng
Response.Close()
để đóng ngay kết nối với máy khách. Per MSDN bài viết trên blog này , phương pháp này không dành cho xử lý yêu cầu HTTP bình thường. Rất khó có khả năng bạn có lý do chính đáng để gọi phương pháp này. - sử dụng
CompleteRequest()
để kết thúc một yêu cầu bình thường.CompleteRequest
làm cho đường ống dẫn ASP.NET nhảy tớiEndRequest
sự kiện, sau khiHttpApplication
sự kiện hiện tại hoàn thành. Vì vậy, nếu bạn gọiCompleteRequest
, sau đó viết một cái gì đó nhiều hơn để trả lời, viết sẽ được gửi cho khách hàng.
Chỉnh sửa - ngày 13 tháng 4 năm 2011
Rõ ràng hơn có sẵn ở đây:
- Bài viết hữu ích trên Blog MSDN
- Phân tích hữu ích của Jon Reid
Response.Redirect
và Server.Transfer
cả hai cuộc gọi Response.End
và cũng nên tránh.
Response.End
ThreadAbortException
tốt.