Global.asax Session_Start()无限循环

时间:2011-10-11 09:10:27

标签: asp.net session-cookies

在我的Global.asax文件中,我有以下代码处理未处理的异常:

void Application_Error(object sender, EventArgs e)
{
    Application["Exception"] = Server.GetLastError();
    Response.Redirect("ErrorPage.aspx");
}

(ErrorPage.aspx从Application中检索异常详细信息,并处理它。)

仍在Global.asax中,我运行以下代码来检查各种与用户相关的内容:

void Session_Start(object sender, EventArgs e)
{
    ... // All sorts of user-related stuff
}

通常情况下,错误重定向和用户相关的东西都可以正常工作。

但是,如果在Session_Start期间抛出错误,则会重定向该页面,并且会再次调用 Session_Start

这导致无限循环。

根据我发现的herehere,这是因为某种问题而发生的,这使得浏览器和/或服务器认为会话重新开始重定向。

有谁知道如何解决cookie问题?

2 个答案:

答案 0 :(得分:2)

我会在Session_Start中设置一个标志,告诉“发生错误时不要重定向”,如下所示:

void Session_Start(object sender, EventArgs e)
{
    Application["DoNotRedirectOnError"] = true
    ... // All sorts of user-related stuff
    Application["DoNotRedirectOnError"] = false
}

然后在错误处理中,检查该标志并改为使用Server.Execute

void Application_Error(object sender, EventArgs e)
{
    Application["Exception"] = Server.GetLastError();
    if (Application["DoNotRedirectOnError"] != null && (bool)Application["DoNotRedirectOnError"] == true)
    {
        Server.Execute("ErrorPage.aspx");
        Application["DoNotRedirectOnError"] = false;
    }
    else
    {
        Response.Redirect("ErrorPage.aspx");
    }
}

这仍将执行幕后的页面(记录错误等),但不应再次触发Session Start。

答案 1 :(得分:1)

尽可能简化Session_Start内的逻辑并设置try catch,以便处理所有异常。使用日志来记录在这样的catch块中发生的事情,以防控制流进入catch(你应该在你的应用程序的任何一个catch块中记录异常... :)),但是不要从{{1 }}