문제

오류 메시지를 사용자 정의 페이지에 전달하는 올바른 방법이라면이 솔루션에 대해 어떻게 생각했는지 궁금하십니까?

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>

내 오류에서 .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;
    }
}

문제 : 나는 Global.asax에서 Server.Transfer를하고 싶지 않습니다. 나에게 서투른 것처럼 보였다. CustomERRORS를 원격으로 변경할 수 있기를 원합니다. 따라서 어딘가에 마지막 예외를 저장해야하지만 세션이 될 수는 없으므로 캐시에 저장하지만 캐시가 글로벌이기 때문에 일부 추가 데이터 (Time 및 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;
    }
}

익명의 사용자 인 경우 SessionId에 참고 SessionID 및 Ex.Data.Add 이미있는 키를 사용하여 오류가 발생할 수 있습니다.

도움이 되었습니까?

해결책

나는 그것이 그것을하는 괜찮은 방법이라고 생각합니다. 그것은 내가하는 방식이 아니지만 내 코드가 게시하기에는 너무 길다 (및 vb.net).

내가 변경하려는 한 가지는 오류 페이지 자체입니다. 오류를 표시하는 대신 사용자가 이메일 주소를 입력 할 수있는 옵션 필드로 오류 페이지에 텍스트 상자를 추가하고 버튼을 클릭하여 오류 보고서를 보내십시오. 그런 다음 오류 보고서를 받으면 문제를보고 회신 할 수 있습니다. 훨씬 더 사용자 친화적 인 방법이며 내가 한 사이트에 대해 잘 작동했습니다.

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

다른 팁

우리는 당신을 위해 일하거나 작동하지 않을 수도있는 일을합니다. 우리는 DB에서 광범위한 로깅을합니다. 오류가 발생하면 로그인하여 오류 ID가 생성됩니다. 오류 ID를 사용하여 일반 페이지로 리디렉션하고 세부 사항을 얻습니다.

물론 이것은 오류가 'DB에 연결할 수 없다'는 경우 얼굴이 평평하지만 너무 자주 발생하지는 않습니다.)

캐시가 글로벌이기 때문에 이것은 누구에게 잘못된 오류를 표시 할 수 있다고 말했듯이, 이것은 권장되지 않을 것입니다. 또한 보안상의 이유로 오류 메시지를 최종 사용자에게 직접 출력해서는 안된다고 말해야합니다.

이 문제를 살펴보십시오.

ASP.NET 사용자 정의 오류 페이지 서버 GetLasterror는 NULL입니다

요약하려면 다음과 같은 것을 넣으십시오.

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

CustomerRors 섹션의 설정을 사용하여 asp.net에 의존하지 않고 리디렉션을 수행하는 대신.

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

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

Server.ClearError();

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

사용자 정의 오류 페이지를 작성했습니다. 모든 것이 매우 간단했습니다. web.config 파일에서 다음과 같습니다.

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

그리고 Global.asax, Application_error 메소드에서 : 일부 코드 ...

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();

또한 캐시 [ ""] 코드와 함께 작동했지만 세션 변수를 선호했습니다.

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

  • 사용자 정의 오류 페이지에서 오류를 지우는 것을 잊지 마십시오. 이건 중요하다. 또한 사용자에게 모든 오류를 정확하게 표시하지 않도록 표시됩니다. 어쩌면 특정 사용자 친화적 인 형식 일 수도 있습니다. 로그 파일에 모든 정보를 제공하거나 이메일이나 다른 정보를 통해 보내십시오.

이것이 유용하기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top