Существует нет простого и элегантного решения проблемы Redirect
в ASP.Net WebForms. Вы можете выбрать между решением Dirty и решением Tedious
Dirty : Response.Redirect(url)
отправляет перенаправление в браузер, а затем выдает ThreadAbortedException
, чтобы завершить текущий поток. Таким образом, никакой код не выполняется после вызова Redirect (). Недостатки: это плохая практика, которая может повлиять на производительность, чтобы убить потоки, подобные этой. Кроме того, ThreadAbortedExceptions
будет отображаться в журнале исключений.
Утомительно : рекомендуемый способ - вызвать Response.Redirect(url, false)
, а затем Context.ApplicationInstance.CompleteRequest()
Однако выполнение кода будет продолжено, а остальные обработчики событий в жизненном цикле страницы будут по-прежнему выполняться. (Например, если вы выполняете перенаправление в Page_Load, не только будет выполняться остальная часть обработчика, также будет вызываться Page_PreRender и т. Д. - отображаемая страница просто не будет отправлена в браузер. Вы можете избежать дополнительной обработки, выполнив например, установить флаг на странице, а затем позволить последующим обработчикам событий проверить этот флаг перед выполнением какой-либо обработки.
(Документация к CompleteRequest
гласит, что « заставляет ASP.NET обходить все события и фильтрацию в цепочке выполнения конвейера HTTP ». Это может быть неправильно понято. Это обходит дальнейший HTTP фильтры и модули, но не пропускает дальнейшие события в текущем жизненном цикле page .)
Более глубокая проблема заключается в том, что в WebForms отсутствует уровень абстракции. Когда вы находитесь в обработчике событий, вы уже находитесь в процессе создания страницы для вывода. Перенаправление в обработчике событий ужасно, потому что вы завершаете частично сгенерированную страницу, чтобы создать другую страницу. MVC не имеет этой проблемы, поскольку поток управления отделен от представлений рендеринга, поэтому вы можете выполнить чистое перенаправление, просто возвращая RedirectAction
в контроллере, не генерируя представление.