ApplicationInstance.CompleteRequest не останавливает выполнение кода под ним?

Мне сказали, что Respond.Redirect - дорогостоящий процесс, потому что он вызывает исключение ThreadAbortException. Поэтому вместо этого мы должны использовать функцию CompleteRequest. Поэтому я попробовал, но заметил, что коды под ним все еще работают, чего я не хочу. Я хочу немедленно заставить браузер перейти на другой веб-сайт.

Public Shared Sub TestCompleteRequest()
            If 1 = 1 Then
                System.Web.HttpContext.Current.Response.Redirect("Http://Google.com", False)
                System.Web.HttpContext.Current.ApplicationInstance.CompleteRequest()
            End If

            Throw New ApplicationException("Hello, why are you here?")
End Sub

Что касается вышеприведенного кода, ApplicationException все еще бросается. Но почему?: (

Ответ 1

Один метод не заменяет другого напрямую. Метод CompleteRequest() не завершает выполнение при его вызове. Итак, если это действительно то, что вы хотите сделать, то Response.Redirect(string) будет способом перехода.

CompleteRequest() просто обходит метод Response.End(), который генерирует описанное вами ThreadAbortException, но в решающей ситуации CompleteRequest() очищает буфер ответа. Это означает, что ответ перенаправления HTTP 302 отправляется в браузер в строке, где вы вызываете CompleteRequest(), что дает вам возможность выполнять операции, которые не влияют на ответ после его отправки в пользователь.

Решение для вас действительно зависит от того, что вам нужно достичь, можете ли вы привести пример того, что вы используете Response.Redirect для и что другой код находится в том же методе?

Ответ 2

Вызов метода в структуре ASP.NET связан с запросом, но факт заключается в том, что вы все еще пишете и выполняете VB.NET - там ничего не существует (и не должно быть, Я бы сказал), который указывает, "когда этот метод вернется, выполните Exit Sub".

Кто скажет, что вы не захотите выполнить еще какой-либо метод после того, как сообщите ASP.NET о завершении запроса?