Ця стаття KB говорить про те, що ASP.NET Response.End()
припиняє нитку.
Рефлектор показує, що це виглядає приблизно так:
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 квітня 2011 року
Додаткову ясність можна знайти тут:
- Корисна публікація в блозі MSDN
- Корисний аналіз Джона Рейда
Response.Redirect
і те, і Server.Transfer
інше дзвоніть, Response.End
і його також слід уникати.
Response.End
ThreadAbortException
просто чудове.