Ця стаття 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.EndThreadAbortExceptionпросто чудове.