错误处理程序页面上的递归重定向

时间:2009-06-16 23:05:01

标签: asp.net

我在母版页上使用以下MSDN代码来检测浏览器是否接受cookie:

protected void Page_Load(object sender, EventArgs e)
{
    if(!this.IsPostBack) {
        if(Request.QueryString["CookieTest"] == null) {
            Response.Cookies["TestCookie"].Value = "Test";
            Response.Redirect("CookieCheck.aspx.redirect=" + Server.UrlEncode(Request.Url.ToString())));
        }
        else if((string)Request.QueryString["Test"] == "passed") {
            // my stuff...
        }
    }
}

CookieCheck.aspx包含以下内容:

protected void Page_Load(object sender, EventArgs e)
{
    if(Request.Cookies["TestCookie"] == null)
        Response.Redirect(Request.QueryString["redirect"] + "?Test=notPassed", true);
     else
        Response.Redirect(Request.QueryString["redirect"] + "?Test=passed", true);
}

在web.config中我定义了以下内容:

<customErrors mode="On" defaultRedirect="Error.aspx" />

现在识别cookie效果很好,但是我遇到了这个问题:每当页面出现错误而我应该被重定向到Error.aspx(这在整个cookie检测之前都有效),重定向似乎卡住了在一个无限循环中,并将越来越多的“?Test =传递”附加到URL。我应该提一下,Errors.aspx也有相同的主页,因此也执行cookie检查。但是我不知道为什么重定向不会停止。有没有办法解决这个问题,除了将Errors.aspx页面从主页面中排除?非常感谢你。

2 个答案:

答案 0 :(得分:1)

如果CookieCheck.aspx页面也使用相同的Master页面,它将继续递归重定向,请确保CookieCheck.aspx不使用相同的MasterPage。

我宁愿建议不要使用MasterPages,Master Pages设计用于Visual Inheritance而不是代码继承,如果你想制作一些特殊类型的页面来检查浏览器使用cookies的能力,你可以拥有这些页面的新基类

public abstract class CookieEnabledPage : Page
{
}

并将您的逻辑添加到此类,然后每当您需要使用此行为创建新页面时,您都从此基类继承。我认为这是一种更干净的方式来做你想做的事。

答案 1 :(得分:0)

我猜主页(或组合masterpage-error.aspx)引发异常,触发重定向到error.aspx,这反过来导致母版重启其生命周期并引发新的异常。 “?Test = pass”的串联几乎肯定是每次发生错误重定向时重新调用cookie测试的副作用。 我建议启动调试器并在Masterpage.aspx.cs中的Page_Load处设置断点,然后逐步执行,直到重定向到错误页面(执行的最后一行是引发异常的行)。