Когда я использую Ответ. Перенаправление (...) для перенаправления моей формы к новой странице я получаю ошибку:
Первое случайное исключение типа 'Система. Поточная обработка. ThreadAbortException' произошел в mscorlib.dll
Исключение типа 'Система. Поточная обработка. ThreadAbortException' произошел в mscorlib.dll, но не был обработан в пользовательском коде
Мое понимание этого - то, что ошибка вызывается веб-сервером, прерывающим остаток страницы, к response.redirect обратились.
Я знаю, что могу добавить второй параметр к Response.Redirect
это называют endResponse. Если я установил endResponse на Истинный, я все еще получаю ошибку, но если я установил его на Ложь затем, я не делаю. Я вполне уверен, хотя тот, который означает, веб-сервер выполняет остальную часть страницы, я перенаправил далеко от. Который, казалось бы, был бы неэффективен по меньшей мере. Существует ли лучший способ сделать это? Что-то другое, чем Response.Redirect
или есть ли способ вынудить старую страницу прекратить загружаться, где я не получу a ThreadAbortException
?
Правильная схема заключается в вызове перегрузки Redirect с endResponse=false и вызове, чтобы сообщить конвейеру IIS, что он должен перейти непосредственно к стадии EndRequest, как только вы вернете управление:
Response.Redirect(url, false);
Context.ApplicationInstance.CompleteRequest();
Эта запись в блоге от Thomas Marquardt содержит дополнительные детали, включая то, как обрабатывать особый случай перенаправления внутри обработчика Application_Error.
Именно так работает Response.Redirect(url, true). Он выбрасывает исключение ThreadAbortException, чтобы прервать поток. Просто игнорируйте это исключение. (Я предполагаю, что это какой-то глобальный обработчик ошибок/логгер, где вы его видите?)
Интересная смежная дискуссия Считается ли Response.End() вредным?
Вот официальная линия по проблеме (я не смог найти последнюю, но не думаю, что ситуация изменилась для более поздних версий .net)
Response.Redirect()
выбрасывает исключение для прерывания текущего запроса.
Эта KB статья описывает такое поведение (также для методов Request.End()
и Server.Transfer()
).
Для Response.Redirect()
существует перегрузка:
Response.Redirect(String url, bool endResponse)
Если передать endResponse=false, то исключение не будет выброшено (но среда выполнения продолжит обработку текущего запроса).
Если endResponse=true (или если используется другая перегрузка), то исключение будет выброшено и текущий запрос будет немедленно завершен.
У меня тоже была такая проблема. Попробуйте использовать Server.Transfer вместо Response.Redirect У меня сработало