在我的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 !
这导致无限循环。
根据我发现的here和here,这是因为某种session-cookies问题而发生的,这使得浏览器和/或服务器认为会话重新开始重定向。
有谁知道如何解决cookie问题?
答案 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 }}