Интересно, что вы думаете об этом решении, если это правильный способ передать сообщение об ошибке на пользовательскую страницу?Лучший способ передать последнюю ошибку в настраиваемую переадресацию ошибок?
В web.config:
<customErrors mode="On" defaultRedirect="~/Error.aspx"></customErrors>
В 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>
В моих 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;
}
}
выпуска: я не хочу сделать Server.Transfer из Global.asax, потому что .. я не знаю. Казалось неуклюжим для меня. Хотите, чтобы изменить customErrors на RemoteOnly. Так что нужно сохранять последнее исключение где-то, но не может быть сеансом, поэтому сохраняйте его в кэше, но с некоторыми дополнительными данными (время и SessionID), так как Cache является глобальным и хочет удостовериться, что кто-то не показал неправильную ошибку.
Я несколько изменил свой код. Теперь это просто:
void Application_Error(object sender, EventArgs e)
{
HttpContext.Current.Cache["LastError"] = Server.GetLastError().GetBaseException();
Server.ClearError();
}
... и ...
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;
}
}
Примечание не существует, если анонимный пользователь, и SESSIONID ex.Data.Add ключ, который уже будет вызывать ошибки делает меня понять важно называть ClearError
Для записи страницы, которые переадресовывают ошибки, действительно раздражают, так как им очень сложно отправить вам URL-адрес, по которому я увидел ошибку, или повторить попытку позже. –
Кроме того, Server.Transfer не будет работать для частичных обратных обращений к страницам - мы это делали, но он не срабатывал, когда была инициирована ошибка из UpdatePanel. – cloying