Zastanawiasz się, co myślisz o tym rozwiązaniu, jeśli jest to właściwy sposób przekazania komunikatu o błędzie na niestandardową stronę?Najlepszy sposób przekazania ostatniego błędu do niestandardowego przekierowania błędu?
W web.config:
<customErrors mode="On" defaultRedirect="~/Error.aspx"></customErrors>
W Global.asax:
<script RunAt="server">
void Application_Error(object sender, EventArgs e)
{
Exception ex = Server.GetLastError();
if (ex != null && Session != null)
{
ex.Data.Add("ErrorTime", DateTime.Now);
ex.Data.Add("ErrorSession", Session.SessionID);
HttpContext.Current.Cache["LastError"] = ex;
}
}
</script>
W moich Error.aspx.cs:
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack) return;
if (HttpContext.Current.Cache["LastError"] != null)
{
Exception ex = (Exception)HttpContext.Current.Cache["LastError"];
if (ex.Data["ErrorTime"] != null && ex.Data["ErrorSession"] != null)
if ((DateTime)ex.Data["ErrorTime"] > DateTime.Now.AddSeconds(-30d) && ex.Data["ErrorSession"].ToString() == Session.SessionID)
Label1.Text = ex.InnerException.Message;
}
}
wydania: Nie chcę zrobić Server. Transfer z Global.asax, ponieważ ... Nie wiem. Wydało mi się nieporęczne. Chcesz móc zmienić customErrors na RemoteOnly. Należy więc zapisać gdzieś ostatni wyjątek, ale nie może to być sesja, więc zapisz w pamięci podręcznej, ale z dodatkowymi danymi (time i sessionident), ponieważ pamięć podręczna jest globalna i chcesz się upewnić, że ktoś nie wyświetli błędnego błędu.
Zmieniłem trochę mój kod. Teraz to po prostu:
void Application_Error(object sender, EventArgs e)
{
HttpContext.Current.Cache["LastError"] = Server.GetLastError().GetBaseException();
Server.ClearError();
}
... i ...
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack) return;
if (HttpContext.Current.Cache["LastError"] != null)
{
Exception ex = (Exception)HttpContext.Current.Cache["LastError"];
if (ex != null)
Label1.Text = ex.Message;
}
}
Uwaga nie tam, jeśli użytkownik anonimowy, a sessionid ex.Data.Add klucz, który już nie będzie powodować błąd co mi zrealizować ważne jest, aby wywoływać ClearError
Dla przypomnienia, stron, które wykonują przekierowania na błędy są naprawdę denerwujące, jak robią to dodatkowo trudne dla mnie, aby wysłać Ci URL, na których widziałem błąd lub ponownie później. –
Dodatkowo Server.Transfer nie będzie działać dla niektórych częściowych postbacks stronę - robiliśmy to, ale to było w przypadku braku gdy błąd został zainicjowany z ciągu UpdatePanel – cloying