Response.RedirectPermanent();调用后的进程代码

时间:2014-07-07 09:01:58

标签: asp.net-mvc-4 redirect http-status-code-301

我有以下代码检查异常,如果它是404异常,它将检查网址列表以查看页面是否已被移动,如果匹配,将发出永久重定向到新页面:

    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的标准行为吗?

3 个答案:

答案 0 :(得分:3)

好的,因为事实证明这是标准行为,因为RedirectPermanent有2次重载(我从未看到第二次重载,因为我的VS正在播放):

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

endResponse选项表示永久重定向将继续完成响应或在重定向后立即结束进程。

默认设置为false意味着第一次重载(我使用过的)将完成响应,这就是它调用LogError函数的原因

答案 1 :(得分:-1)

当您使用response.RedirectPermanent()时,它将完全委托请求。它不会在Response.RedirectPermanent(redirect.NewURL)语句后执行或处理任何语句。 如果你使用Response.RedirectPermanent(string,boolean)方法然后将boolean值赋给true然后它将执行你的logerror(异常)

我要求您浏览此链接http://www.stepforth.com/blog/2008/redirects-permanent-301-vs-temporary-302/#.U7pxUfmSx-M

答案 2 :(得分:-1)

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