В этой статье базы Response.End()знаний говорится, что ASP.NET прерывает поток.
Отражатель показывает, что это выглядит так:
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();
}
}
}
Это кажется довольно резким для меня. Как говорится в статье базы знаний, любой следующий код в приложении 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 апреля 2011
Дополнительная ясность доступна здесь:
- Полезный пост в блоге MSDN
- Полезный анализ Джон Рид
Response.Redirectи Server.Transferоба звонка Response.Endи следует также избегать.
Response.EndThreadAbortExceptionпросто отлично.