Выполняет Response.RedirectPermanent(); обрабатывает код после его вызова

#asp.net-mvc-4 #redirect #http-status-code-301

#asp.net-mvc-4 #перенаправление #http-status-code-301

Вопрос:

У меня есть следующий код, который проверяет исключение, и если это исключение 404, он проверит список URL-адресов, чтобы увидеть, была ли страница перемещена, и если оно совпадает, выдаст постоянное перенаправление на новую страницу:

     protected void Application_Error(object sender, EventArgs e)
    {
        var exception = Server.GetLastError();
        if (exception != null)
        {
            if (exception is HttpException)
            {
                TryRedirect((HttpException)exception);
            }

            LogError(exception);
        }
    }

    private void TryRedirect(HttpException httpException)
    {
        if (httpException.GetHttpCode() == 404)
        {
            WebsiteRedirect redirect = SiteCache.Redirects.FirstOrDefault(x => string.Compare(x.LegacyURL, HttpContext.Current.Request.RawUrl, true) == 0);

            if (redirect != null)
            {
                // 301 it to the new url
                Response.RedirectPermanent(redirect.NewURL);
            }
        }
    }
  

Теперь я бы ожидал, что после того, как произойдет перенаправление, не будет выполнен ни один код после него, т.е. LogError функция не будет вызвана. Но, похоже, я получаю сообщения об ошибках для страниц, которые не найдены.

Является ли это стандартным поведением для MVC Response.RedirectPermanent ?

Ответ №1:

Хорошо, так как оказывается, что это стандартное поведение, поскольку RedirectPermanent имеет 2 перегрузки (я никогда не видел второй перегрузки, поскольку мой VS воспроизводился):

 Response.RedirectPermanent(string url);
Response.RedirectPermanent(string url, bool endResponse);
  

Опция endResponse указывает, что постоянное перенаправление будет продолжаться до завершения ответа или завершения процесса сразу после перенаправления.

По умолчанию установлено значение false, что означает, что первая перегрузка (которую я использовал) завершит ответ, поэтому она вызывает LogError функцию

Ответ №2:

При использовании response.RedirectPermanent() он полностью делегирует запрос.Он не собирается выполнять или обрабатывать какой-либо оператор за Response.RedirectPermanent(redirect.NewURL) оператором. Если вы используете Response.Метод RedirectPermanent(string,boolean) затем присваивает логическое значение true, после чего он выполнит вашу logerror (исключение)

Я прошу вас перейти по этой ссылке http://www.stepforth.com/blog/2008/redirects-permanent-301-vs-temporary-302/#.U7pxUfmSx-M

Комментарии:

1. Итак, почему функция LogError вызывается после RedirectPermanent?

2. Это постоянно перенаправляет запрос, т. е. вы не собираетесь возвращать управление с того места, откуда вы звонили

3. Это совершенно неправильно, прочитав дальше в RedirectPermanent , он продолжит обрабатывать ответ, если вы не скажете ему не делать этого — он использует дополнительный логический метод into, который, если установлено значение true, завершит текущий ответ. Если установлено значение false, это завершит текущий ответ. По умолчанию установлено значение false

4. Ответ. RedirectPermanent(url) вызовет Response. RedirectPermanent (url, false) означает, что он обработает все после

5. да, я согласен.потому что значение по умолчанию равно false. @Pete

Ответ №3:

 Response.RedirectPermanent(string url, bool endResponse);
return null;
  

Комментарии:

1. Я не понимаю, как это отвечает на вопрос «что происходит после вызова перенаправления».