2009-07-14 2 views
5

사용자 정의 페이지에 오류 메시지를 전달하는 것이 올바른지 알고 싶다면이 솔루션에 대해 어떻게 생각하십니까? 내 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를 호출하는 것이 중요합니다.

+0

기록을 남기려면 오류가 발생했을 때 URL을 보내거나 나중에 다시 시도하기가 어렵 기 때문에 오류가 발생하면 리디렉션되는 페이지가 실제로 성가시다. –

+0

또한, Server.Transfer는 부분 페이지 재발행을 위해 작동하지 않습니다. 우리는 그렇게하고 있었지만 UpdatePanel에서 오류가 시작되면 실패했습니다. – cloying

답변

7

나는 그것을 할 수있는 괜찮은 방법입니다 생각합니다. 그것은 내가하는 방식이 아니지만, 내 코드는 (그리고 VB.NET에서) 너무 길다.

내가 변경하려는 것은 오류 페이지 자체입니다. 오류를 표시하는 대신 오류 페이지에 사용자가 전자 메일 주소를 입력하고 단추를 클릭하여 오류 보고서를 보낼 수있는 선택적 필드로 텍스트 상자를 추가하는 것이 좋습니다. 그런 다음 오류 보고서를 받으면 문제점을보고 응답 할 수 있습니다. 그것은 훨씬 더 사용자 친화적 인 방법이며,이 작업을 수행 한 사이트에 대해서는 상당히 효과적입니다.

그 라인을 따라 양식 데이터, 세션 데이터 및 기타 가치있는 것을 수집하여이를 오류 보고서에도 넣을 수 있습니다. 이렇게하면 문제를 훨씬 쉽게 진단 할 수 있습니다.

+0

+1 좋은 답변 - 이메일을 보낼 공간을 사용자에게 제공하는 것이 좋습니다. 우리는 사용자 기반의 크기 때문에 그렇게 할 수는 없지만 DB에 모든 것을 기록합니다. –

+0

감사합니다. 그것은 우리를 위해 잘 해결되었습니다. 가장 큰 사이트에서 우리는 50,000 명이 넘는 사용자가 15-20 페이지의 온라인 신청서를 작성했습니다. 그리고이 기술에 대해 내가 알게 된 것은 사용자의 기대와 내 자신의 것이기 때문에 긴박감을 유발한다는 것입니다. 모든 버그를 제거하도록 동기를 부여하는 방법이 있습니다. 그리고 일단 그렇게하면 웹 사이트를 지원하는 데 훨씬 적은 시간을 보내고 웹 사이트를 개선하는 데 더 많은 시간을 씁니다. –

+0

그냥 확장하면 좋은 오류보고가 얼마나 중요한지 충분히 강조 할 수 없습니다. 문맥에 오류를 넣는 많은 세부 사항을 받으면 정말 도움이됩니다. 예를 들어 모든 양식 키/값 쌍을 반복하여 오류 보고서에 포함 시키면 사용자가 양식에 입력 한 내용을 알 수 있습니다. –

1

캐시가 전역 적이므로 누군가에게 잘못된 오류를 표시 할 수 있다고 말했기 때문에 이것은 바람직하지 않습니다. 또한 보안상의 이유로 최종 사용자에게 오류 메시지를 직접 출력해서는 안됩니다. 설정에서를 사용하여 리디렉션을 수행 할

Server.Transfer(String.Concat("~/Error.aspx?message=", HttpUtility.UrlEncode(ex.InnerException.Message))) 

보다는 ASP.NET에 의존 :

ASP.NET custom error page server GetLastError is null

넣어 다음과 같은 일을 요약하면 :

이 문제에서보세요 CustomErrors 섹션.

+1

+1 - 오류 메시지를 표시하지 말아야한다는 것에 동의합니다. 사용자. 내 답변에 설명 된대로 데이터베이스에 기록합니다. –

1

우리는 당신을 위해 효과가 있거나 그렇지 않을 수도있는 것을합니다. 우리는 DB에 광범위하게 로깅을합니다. 오류가 발생하면 오류를 기록하고 오류 ID를 생성합니다. 오류 ID가있는 일반 페이지로 리디렉션하고 세부 정보를 가져옵니다. 오류가 'DB에 연결할 수 없습니다'입니다하지만 너무 자주 발생하지 않는 경우이 얼굴에 평평하게 떨어질 물론

)

+0

+1 저에게서 - 제 대답은 조금 다릅니다. 그러나 DB 로깅을 사용합니다. 그래서 당신을 upvoted. –

1

n8wrl과 Steve 모두 동의해야합니다. 더 나은 방법은 데이터베이스에 오류를 기록한 다음 사용자에게 오류 ID 만 반환하는 것입니다. 그들은 실제로 기술 세부 사항을 볼 필요가 없으며 민감한 정보가 노출 될 수 있습니다.

우리의 경우 사용자 ID (사용 가능한 경우)와 오류가 발생한 페이지도 전달합니다 (Request.URL은 전역 Application_Error에 도달했을 때 여전히 유용합니다). 이렇게하면 오류를 좀 더 쉽게 추적 할 수 있습니다. 또한 스크립트 태그와 함께 Global.asax를 사용할 필요가 없습니다. App_Code 디렉토리에 Global.asax.cs 파일을 만드는 경우 C#을 직접 코딩 할 수 있습니다 (프로젝트 유형에 따라 다를 수 있음).

0
Server.ClearError(); 

이 줄은 ErrorMessage를 표시 한 후에 Error.aspx.cs에 배치해야합니다.

+0

기본 구성에서 Windows 이벤트 로그에 오류가 기록되는 것을 방지 할 수 있다고 생각합니다. – Sam

0

나는 맞춤 오류 페이지를 작성하는 책임이 있습니다. 함으로써 Application_Error 방법에

<customErrors mode="On"> 
<error statusCode="404" redirect="~/error-pages/page-not-found.aspx?error=1" 
</customErrors> 

과의 Global.asax에 : 내가 가진 web.config 파일 : 모든 꽤 간단했다 일부 코드 ... 사용자 지정 오류에서

Server.Transfer("~/error-pages/error.aspx"); 

페이지 "error.aspx": Server.ClearError();

정확히 무엇이 수정되었는지는 모르겠지만 더 이상 작동하지 않았습니다. 코드가 Server.Transfer 메서드에 도달하면 예외가 항상 발생했습니다. 페이지에 대한 자식 요청을 실행하는 중 오류가 발생했습니다. ...

일부 솔루션을 살펴본 결과 마지막으로이 솔루션을 발견했습니다. 나는 내 코드를 수정, 지금은 작동하는 것 같다 :

<customErrors mode="On" defaultRedirect="~/error-pages/error.aspx"> 
    <error statusCode="404" redirect="~/error-pages/page-not-found.aspx?error=1" /> 
</customErrors> 

과 Global.asax에 방법에

: 그것은 또한 캐시 [ ""] 코드와 함께 일

Session["LastError"] = Server.GetLastError(); 

,하지만 난 선호 Session 변수

응답 해 주셔서 감사합니다.

  • 맞춤 오류 페이지에서 오류를 삭제하는 것을 잊지 마세요. 이건 중요하다. 또한 사용자에게 정확히 모든 오류를 표시하지 않는 것으로 표시됩니다. 특정 사용자에게 친숙한 형식 일 수 있습니다. 로그 파일에 모든 정보를 제공하거나 이메일 또는 다른 것을 통해 보낼 수 있습니다.

희망이 유용했습니다.