This KB Article says that ASP.NET's Response.End() aborts a thread.
Reflector shows that it looks like this:
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();
}
}
}
This seems pretty harsh to me. As the KB article says, any code in the app following Response.End() will not be executed, and that violates the principle of least astonishment. It's almost like Application.Exit() in a WinForms app. The thread abort exception caused by Response.End() is not catchable, so surrounding the code in a try..finally won't satisfy.
It makes me wonder if I should always avoid Response.End().
Can anyone suggest, when should I use Response.End(), when Response.Close() and when HttpContext.Current.ApplicationInstance.CompleteRequest()?
ref: Rick Strahl's blog entry.
Based on the input I've received, my answer is, Yes, Response.End is harmful, but it is useful in some limited cases.
- use Response.End() as an uncatchable throw, to immediately terminate the HttpResponse in exceptional conditions. Can be useful during debugging also. Avoid Response.End() to complete routine responses.
- use Response.Close() to indicate the response is done.
- use CompleteRequest() to ... ??
(I still don't know the difference between Response.Close and CompleteRequest().)