要说的一句话。这是有史以来最好的.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,我认为这对站点不利。(我可以捕获它而不记录它。)
你认为你们有什么想法?
答案 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。