指定其他页面时,重定向到webapp默认文档?

时间:2010-02-04 22:05:27

标签: asp.net redirect iis-6 response default-document

IIS6,ASP.NET 2.0,无表单身份验证

我正在调用Response.Redirect(“〜/ foo.aspx”),但我的网站的默认文档(“Default.aspx”)正在出现。更糟糕的是,它只会间歇性地发生。有时重定向会显示正确的页面。

我已经检查了会话状态,我在web.config中没有看到任何值(也就是说,我假设我使用的是20分钟默认值)。

我希望我能分享更多相关信息(我会尽力回答任何问题)。

有什么想法吗?为什么不重定向到指定的页面?

编辑:我看起来更深入了解代码并了解更多细节。

确定。有foo.aspx和foo2.aspx(以及默认文档Default.aspx)。所有页面都从BasePage扩展,扩展了Page。

BasePage有一个名为ReturnPage的属性:

protected string ReturnPage {
    get {
        if (Session["ReturnPage"] == null) {
            Session["ReturnPage"] = "";
        }
        return Session["ReturnPage"].ToString();
    }
    set { Session["ReturnPage"] = value; }
}

用户点击foo.aspx上的LinkBut​​ton,click事件处理程序以两行代码结束:

ReturnPage = ResolveUrl("~/foo.aspx");
Response.Redirect(ResolveUrl("~/foo2.aspx"));

foo2.aspx的Page_Load存在问题,其错误处理调用Response.Redirect(ReturnPage)。

当我查看foo2.aspx的响应头时,302位置是string.Empty(也就是说,没有一个)。相同的响应头与foo.aspx的响应具有相同的ASP.NET会话ID。

请记住 - 这是间歇性的。有时候,你可以点击那个LinkBut​​ton并毫不费力地去foo2.aspx,没问题。您可以使用完全相同的数据处理单击一次,但它将失败。你将从默认文件(Default.aspx,你被“bug”发送)返回到foo.aspx,再次点击相同的数据(网格/表格中的同一行 - 相同的LinkBut​​ton,基本上),你将被重定向到foo2.aspx没有问题。

4 个答案:

答案 0 :(得分:1)

Placing a value in the session immediately before a Response.Redirect() is risky.

将foo.aspx的Response.Redirect()更改为以下内容可能会更可靠地保留会话值:

Response.Redirect("~/foo2.aspx", false);

更新:只有将会话状态移动到SQL Server才能解决此问题。请参阅相关问题:Why/when are session writes vulnerable to thread termination?

答案 1 :(得分:0)

当你说:

  

有时重定向会显示正确的页面。

是否只是发生了,您不确定是否有某些页面受到问题的影响?如果是这种情况,那么您可能遇到了寻址问题。您可以使用相对路径或绝对路径,而不是应用程序相对路径。我猜你也试图直接从你网站上的子目录或你网站上的子目录导入页面。如果您选择坚持使用Application-relative路径,请确保将子目录考虑在内。 (例如:〜/ FooPages / Foo.aspx)

这是我刚发现的一个很好的参考页面: http://nathanaeljones.com/129/types-of-asp-net-paths/

答案 2 :(得分:0)

重定向并从foo2.aspx获取BasePage的新实例后,该ReturnPage属性是否会再次为null?然后,一旦您的页面加载错误并尝试重定向,它将访问一个空字符串。也许尝试在Session

中抛出该属性
Session.Add("ReturnPage","~/foo.aspx") 

而不是

ReturnPage = ResolveUrl("~/foo.aspx");

当然,您必须在页面加载中修改该错误处理以将其从会话中取出而不是属性,并且如果事实证明这是问题,您可能必须重新考虑整个重定向在您的系统中的工作方式。

修改 要测试这个关于属性没有设置或正确设置的想法....(只是为了测试我不建议你应该在那里硬编码路径),将你的getter更改为下面的例子,然后检查是否有用。希望这有帮助,我很想知道问题是什么,如果这不是问题。

get { 
   if (Session["ReturnPage"] == null) { 
        Session["ReturnPage"] = "~/foo.aspx"; 
    } 
    return Session["ReturnPage"].ToString(); 

} 

答案 3 :(得分:0)

我在这里有点困惑。你到底想要完成什么?您正在获取默认文档,因为302为空白。您的“不一致”行为几乎肯定是由于您在会话中保存数据的方式。

这里真正的问题是当foo2.aspx“有问题”时你重定向的原因。这有什么问题?为什么要重定向?如果您确实需要重定向,为什么重定向目标会发生变化?将它设为静态错误报告页面,你会没事的。