Вам было интересно, что вы думаете об этом решении, если это правильный способ передать сообщение об ошибке на пользовательскую страницу?
В 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. Поэтому нужно где-то сохранить последнее исключение, но это не может быть Session, поэтому сохраните его в Cache, но с некоторыми дополнительными данными (time и 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. Добавление уже существующего ключа приведет к ошибке, из-за которой я понимаю, что важно вызвать ClearError