重定向ASP.NET页面

时间:2010-08-22 16:13:47

标签: asp.net response

要说的一句话。这是有史以来最好的.NET社区。坚持下去!

我最近遇到了一个问题,我设法找到了2个解决方案,我想知道应该选择哪一个。

问题在于:

当用户请求我的网站(www. .com)时,我会将其重定向到(www. .com / en),因为它是一个多语言网站

我正在使用.NET路由。

在default.aspx页面的Page_Load中,我检查路由收集中的语言是否可用,我不重定向。如果没有,我会重定向到(www.___.com/en)。这是代码:

    if (Page.RouteData.Values.Count == 0)
    {
        if (SessionManager.IsUserAuthenticated)
        {
            //Redirect To User HomePage for his Main Language
            Page.Response.Redirect(UserManager.GetUserMainPageWhenLoggedIn(SessionManager.LoggedUser.LanguageID,true));                                
        }
        else
        {
            Page.Response.Redirect(String.Format("~/{0}", Cultures.en.ToString()), true);
            Helpers.SetCulture(Cultures.en.ToString());
        }

    }

我正在使用Response.Redirect来做到这一点。现在,如果我设置为结束响应方法参数,它将抛出异常,以便我可以通过

处理它
 try
    {
       this.InitializeLayout();
    }
    catch (ThreadAbortException ex)
    {

    }
    catch (Exception ex)
    {
        ExceptionManager.LogException(ex);
    }

如果我没有结束响应,页面将执行整个生命周期,重定向然后再次执行,这会导致页面的双重执行。

我的主要目标是不执行2次页面以最小化处理(如果网站受到大流量的打击)。如果我结束响应,将抛出一个ThreadAbortExeption,我认为这对站点不利。(我可以捕获它而不记录它。)

你认为你们有什么想法?

2 个答案:

答案 0 :(得分:1)

如你所说,你可以避免抛出异常,将false传递给endResponse参数。如果您想避免执行该页面,您还可以调用 HttpContext.Current.ApplicationInstance.CompleteRequest(); ,它应该跳过页面上的其余代码。

但请注意,回发和渲染方法仍将执行。如果要避免这种情况,则必须明确包含代码以忽略它们。通过覆盖 RaisePostBackEvent 渲染方法来完成此操作的一个很好的示例如下: - > http://www.c6software.com/articles/ThreadAbortException.aspx

答案 1 :(得分:0)

您可以使用 global.asax 文件中的 Application_BeginRequest 事件处理程序或HttpHandler来执行重定向。在这两种情况下,您都可以避免2次通话。

我还建议您使用 server.Transfer 而不是response.redirect。