사용자 정의 페이지에 오류 메시지를 전달하는 것이 올바른지 알고 싶다면이 솔루션에 대해 어떻게 생각하십니까? 내 Error.aspx.cs에서마지막 오류를 맞춤 오류 리디렉션에 전달하는 가장 좋은 방법은 무엇입니까?
<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>
:
<customErrors mode="On" defaultRedirect="~/Error.aspx"></customErrors>
의 Global.asax에서 : Web.config의에서
문제의
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;
}
}
: 난 몰라 Global.asax에서 Server.Transfer를하고 싶습니다. 잘 모르겠습니다. 내게 서투른 것처럼 보였다. customErrors를 RemoteOnly로 변경할 수 있습니다. 따라서 어딘가에 마지막 예외를 저장해야하지만, Session이 될 수는 없으므로 Cache가 전역이므로 일부 추가 데이터 (시간 및 SessionID)를 사용하여 캐시에 저장하고 다른 사람에게 잘못된 오류가 표시되지 않도록해야합니다.
코드가 다소 변경되었습니다. 지금은 그냥 :
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;
}
}
참고가 이미 오류가 나를 실현하기가 발생할 것 키를 ex.Data.Add 거기 익명 사용자의 경우, 및 세션 ID ClearError를 호출하는 것이 중요합니다.
기록을 남기려면 오류가 발생했을 때 URL을 보내거나 나중에 다시 시도하기가 어렵 기 때문에 오류가 발생하면 리디렉션되는 페이지가 실제로 성가시다. –
또한, Server.Transfer는 부분 페이지 재발행을 위해 작동하지 않습니다. 우리는 그렇게하고 있었지만 UpdatePanel에서 오류가 시작되면 실패했습니다. – cloying