2

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

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

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

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

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

编辑:我已经深入研究了代码并了解了更多细节。

行。有 foo.aspx 和 foo2.aspx(以及默认文档 Default.aspx)。所有页面都从 BasePage 扩展而来,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,点击事件处理程序以两行代码结束:

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。

请记住——这是间歇性的。有时,您可以单击该链接按钮并毫不费力地转到 foo2.aspx,没问题。您可以使用完全相同的数据处理一次单击,它会失败。您将从默认文档(Default.aspx,“错误”发送您的位置)导航回 foo.aspx,再次单击相同的数据(网格/表格中的同一行 - 相同的 LinkBut​​ton,本质上),您将毫无问题地被重定向到 foo2.aspx。

4

4 回答 4

1

在 Response.Redirect() 之前立即在会话中放置一个值是有风险的。

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

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

更新:这最终只能通过将我们的会话状态移动到 SQL Server 来解决。请参阅相关问题:为什么/何时会话写入容易受到线程终止的影响?

于 2010-02-05T20:11:35.407 回答
0

当你说:

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

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

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

于 2010-02-04T22:25:42.327 回答
0

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

Session.Add("ReturnPage","~/foo.aspx") 

代替

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

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

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

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

} 
于 2010-02-04T23:10:23.440 回答
0

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

这里真正的问题是为什么当 foo2.aspx “有问题”时要重定向。这里有什么问题?为什么要重定向?如果真的需要重定向,为什么要更改重定向目标?让它成为一个静态错误报告页面,你会没事的。

于 2010-02-04T23:49:14.070 回答