Visual Basic .NET을 사용하여 ASP.NET 사용자 지정 오류 보고 페이지 만들기

이 문서에서는 Microsoft Visual Basic .NET 코드를 사용하여 ASP.NET 발생할 때 오류를 트래핑하고 대응하는 방법을 설명합니다.

원래 제품 버전: Visual Basic .NET, ASP.NET
원래 KB 번호: 308132

요약

ASP.NET 기존 ASP(Active Server Pages)에서 오류 처리 옵션을 개선했습니다. ASP.NET 애플리케이션의 여러 수준에서 오류를 처리할 수 있습니다.

ASP.NET 새로운 기능

ASP.NET 오류를 처리하고 대응하는 방법에 대한 몇 가지 고급 기능을 제공합니다. 기존 ASP에서는 (또는 try-catch JScript의 블록)를 사용하여 오류를 On Error Resume Next 처리합니다. 또는 IIS(인터넷 정보 서비스)를 실행하는 경우 개체를 ASPError 사용하여 사용자 지정 오류 보고 페이지를 만듭니다. 그러나 이러한 접근 방식에는 제한 사항이 있습니다.

ASP.NET ASP.NET 애플리케이션을 실행할 때 발생할 수 있는 오류를 처리하고 대응할 수 있는 여러 수준을 제공합니다. ASP.NET 발생할 때 오류를 트래핑하고 대응할 수 있는 세 가지 Page_Error 기본 메서드인 이벤트, Application_Error 이벤트 및 애플리케이션 구성 파일(Web.config)을 제공합니다.

이 문서에서는 ASP.NET 애플리케이션에서 이러한 새로운 기능을 사용하는 방법을 보여 줍니다. 이 문서에서는 사용자 지정 오류 페이지와 ASP.NET 직접 관련된 일반적인 오류 보고를 제공하는 방법을 설명하지만, 이 문서에서는 블록 및 CLR(공용 언어 런타임) 예외 시스템과 같은 try-catch-finally 다른 오류 처리 방법을 설명하지 않습니다.

Page_Error 이벤트 사용

이벤트는 Page_Error 페이지 수준에서 발생하는 오류를 트래핑하는 방법을 제공합니다. 따라야 할 샘플 코드와 같이 오류 정보를 표시하거나 이벤트를 기록하거나 다른 작업을 수행할 수 있습니다.

참고

이 예제에서는 데모용으로만 브라우저에 자세한 오류 정보를 표시합니다. 애플리케이션의 최종 사용자에게 자세한 정보를 표시할 때 특히 애플리케이션이 인터넷에서 실행되는 경우 주의해야 합니다. 더 적절한 작업은 사용자에게 오류가 발생했음을 알리는 메시지를 표시한 다음 실제로 이벤트 로그에 특정 오류 세부 정보를 기록하는 것입니다.

이 예제에서는 null 예외를 throw하여 이벤트에서 오류가 발생 Page_Load 하도록 합니다. 다음 단계에 따라 이벤트를 테스트할 초기 페이지를 만듭니다 Page_Error .

  1. PageEvent.aspx 라는 새 파일을 프로젝트에 추가하려면 다음 단계를 수행합니다.

    1. Visual Studio .NET을 엽니다.
    2. 솔루션 탐색기 프로젝트 노드를 마우스 오른쪽 단추로 클릭하고 추가를 가리킨 다음 웹 양식 추가를 클릭합니다.
    3. 이름 텍스트 상자에 PageEvent.aspx 입력한 다음 열기를 클릭합니다.
  2. PageEvent.aspx 다음 코드를 추가합니다.

    <%@ Page Language="vb"%>
    <script runat=server>
        Sub Page_Load(Sender as object, e as EventArgs)
           throw(new System.ArgumentNullException())
        End Sub
        Sub Page_Error(Sender as object, e as EventArgs)
           Dim objErr as Exception = Server.GetLastError().GetBaseException()
           Dim err as String = "<b>Error Caught in Page_Error event</b><hr><br>" & _
                               "<br><b>Error in: </b>" & Request.Url.ToString() & _
                               "<br><b>Error Message: </b>" & objErr.Message.ToString() & _
                               "<br><b>Stack Trace:</b><br>" & _objErr.StackTrace.ToString()
           Response.Write(err.ToString())
           Server.ClearError()
        End Sub
    </script>
    
  3. 파일 메뉴에서 저장PageEvent.aspx 클릭합니다.

  4. 페이지를 마우스 오른쪽 단추로 클릭한 다음 브라우저에서 보기를 클릭하여 페이지를 실행합니다. 코드 사양에 따라 오류가 throw되고 보고됩니다.

참고

코드에서 에 대한 호출을 발급하는 것을 Server.ClearError알 수 있습니다. 이렇게 하면 오류가 계속 Application_Error 이벤트가 처리되지 않습니다.

Application_Error 이벤트 사용

이벤트와 Page_Error 마찬가지로 이벤트를 사용하여 Application_Error 애플리케이션에서 발생하는 오류를 트래핑할 수 있습니다. 이벤트의 애플리케이션 전체 scope 인해 애플리케이션 오류 정보를 기록하거나 발생할 수 있는 다른 애플리케이션 수준 오류를 처리할 수 있습니다.

따라야 할 샘플은 이전 Page_Error 이벤트 코드 샘플을 기반으로 하며 이벤트의 오류가 Page_Load 이벤트에 갇혀 Page_Error 있지 않으면 발생합니다. 이벤트는 Application_Error 애플리케이션의 Global.asax 파일에 지정됩니다. 간단히 하기 위해 이 섹션의 단계에서는 예외를 throw하고 Global.asax 파일의 경우 오류를 Application_Error 트래핑하고 이벤트 로그에 오류를 쓰는 새 페이지를 만듭니다. 다음 단계에서는 이벤트를 사용하는 방법을 보여 줍니다 Application_Error .

  1. 프로젝트에 AppEvent.aspx 라는 새 파일을 추가합니다.

  2. AppEvent.aspx 다음 코드를 추가합니다.

    <script language=vb runat="server">
         Sub Page_Load(Sender as object, e as EventArgs)
             throw(new ArgumentNullException())
         End Sub
    </script>
    
  3. 파일 메뉴에서 저장AppEvent.aspx 클릭합니다.

  4. Application_ErrorGlobal.asax 파일에 이벤트를 추가하여 AppEvent.aspx 페이지의 이벤트에서 throw Page_Load 한 오류를 트래핑합니다. 이벤트 로그를 Imports 사용하려면 Global.asaxSystem.Diagnostics 네임스페이스에 대한 문을 추가해야 합니다.

    Global.asax 파일에 다음 코드를 추가합니다.

    Imports System.Diagnostics
    Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
        Dim objErr As Exception = Server.GetLastError().GetBaseException()
        Dim err As String = "Error Caught in Application_Error event" & _
                                System.Environment.NewLine & _
                                "Error in: " & Request.Url.ToString() & _
                                System.Environment.NewLine & _
                                "Error Message: " & objErr.Message.ToString() & _
                                System.Environment.NewLine & _
                                "Stack Trace:" & objErr.StackTrace.ToString()
        EventLog.WriteEntry("Sample_WebApp", err, EventLogEntryType.Error)
        Server.ClearError()
        additional actions...
    End Sub
    
  5. Global.asax 파일을 저장합니다.

  6. Visual Studio .NET의 빌드 메뉴에서 빌드를 클릭합니다.

  7. 페이지를 마우스 오른쪽 단추로 클릭한 다음 브라우저에서 보기를 클릭합니다. 이 경우 페이지는 비어 있지만 이벤트 로그에 새 항목이 추가된 것을 알 수 있습니다. 이 샘플에서는 이벤트 뷰어 액세스할 수 있는 애플리케이션 로그에 항목을 만듭니다. 오류를 로깅한 후 사용자를 다른 사용자에게 친숙한 오류 페이지로 리디렉션하거나 필요한 경우 몇 가지 추가 작업을 수행할 수 있습니다.

Web.config 파일 사용

또는 Application_Error 이벤트에서 오류를 Page_Error 호출 Server.ClearError 하거나 트래핑하지 않으면 Web.config파일의 섹션에 있는 <customErrors> 설정에 따라 오류가 처리됩니다. <customErrors> 섹션에서 리디렉션 페이지를 기본 오류 페이지()로 지정하거나 발생한 HTTP(defaultRedirectHypertext Transfer Protocol) 오류 코드에 따라 특정 페이지로 지정할 수 있습니다. 이 메서드를 사용하여 사용자가 받는 오류 메시지를 사용자 지정할 수 있습니다.

애플리케이션의 이전 수준에 갇혀 있지 않은 오류가 발생하면 이 사용자 지정 페이지가 표시됩니다. 이 섹션에서는 호출되지 않도록 Global.asax 파일을 수정하는 Server.ClearError 방법을 보여 줍니다. 결과적으로 오류는 Web.config 파일에서 오류를 트래핑하는 마지막 지점으로 처리됩니다.

  1. 이전 예제에서 Global.asax 파일을 엽니다.

  2. Server.ClearErrorWeb.config파일에 오류가 표시되는지 확인하려면 줄을 주석으로 처리 합니다.

  3. 변경 내용을 Global.asax에 저장합니다. 이제 코드가 다음과 유사하게 표시됩니다.

     Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
         Dim objErr As Exception = Server.GetLastError().GetBaseException()
         Dim err As String = "Error Caught in Application_Error event" & _
                             System.Environment.NewLine & _
                             "Error in: " & Request.Url.ToString() & _
                             System.Environment.NewLine & _
                             "Error Message: " & objErr.Message.ToString() & _
                             System.Environment.NewLine & _
                             "Stack Trace:" & objErr.StackTrace.ToString()
         EventLog.WriteEntry("Sample_WebApp", err, EventLogEntryType.Error)
         Server.ClearError()
         additional actions...
     End Sub
    
  4. 섹션에 다음 코드를 <customErrors> 추가하여 사용자를 사용자 지정 페이지로 리디렉션합니다.

    <customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On">
    </customErrors>
    

    참고

    관련 웹 서버 및 애플리케이션 이름을 참조할 수 있도록 특성의 defaultRedirect 파일 경로를 수정해야 합니다.

  5. 이 수준에 갇혀 있는 오류는 기본 오류 페이지로 전송되므로 ErrorStatus.htm라는 오류 페이지를 만들어야 합니다. 이 메서드를 사용하여 사용자에게 표시되는 항목을 제어하므로 이 예제에서는 오류 페이지에 대한.htm 페이지를 사용합니다. ErrorStatus.htm 다음 코드를 추가합니다.

    <HTML>
        <HEAD>
            <TITLE></TITLE>
            <META NAME="GENERATOR" Content="Microsoft Visual Studio 7.0">
        </HEAD>
        <BODY>
             <b>Custom Error page!</b>
             <br>
             You have been redirected here from the <customErrors> section of the
             Web.config file.
        </BODY>
    </HTML>
    
  6. 코드를 테스트하려면 파일을 저장하고 프로젝트를 빌드한 다음 브라우저에서 AppEvent.aspx 봅니다. 오류가 throw되면 ErrorStatus.htm 페이지로 리디렉션됩니다. 섹션의 defaultRedirect 특성 <customErrors> 값에서 기본 오류 페이지를 참조할 수 있지만 발생한 HTTP 오류 코드에 따라 리디렉션할 특정 페이지를 지정할 수도 있습니다. <error> 자식 요소는 이 옵션을 허용합니다. 예를 들면

    <customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On">
        <error statusCode="404" redirect="filenotfound.htm"/>
    </customErrors>
    

참고

섹션의 <customErrors>defaultRedirect 지정된 페이지는 .htm 파일입니다. 및 샘플이 수행하는 .aspx 페이지에서 Page_ErrorApplication_Error 를 사용 GetLastError 하려는 경우 리디렉션이 발생하기 전에 세션 변수 또는 다른 접근 방식에 예외를 저장해야 합니다.

섹션에는 <customErrors>mode 설정된 On 특성이 포함되어 있습니다. 특성은 mode 오류 리디렉션이 발생하는 방식을 제어하는 데 사용됩니다. 예를 들어 애플리케이션을 개발하는 경우 실제 ASP.NET 오류 메시지를 표시하고 사용자에게 친숙한 오류 페이지로 리디렉션하지 않으려는 것이 가장 좋습니다. 특성에는 mode 다음 설정이 포함됩니다.

  • On: 처리되지 않은 예외는 사용자를 지정된 defaultRedirect 페이지로 리디렉션합니다. 주로 mode 프로덕션에서 사용됩니다.

  • Off: 사용자가 예외 정보를 수신하고 페이지로 defaultRedirect 리디렉션되지 않습니다. 이는 mode 주로 개발에서 사용됩니다.

  • RemoteOnly: localhost를 사용하여 로컬 컴퓨터의 사이트에 액세스하는 사용자만 예외 정보를 받습니다. 다른 모든 사용자는 페이지로 defaultRedirect 리디렉션됩니다. 이 모드는 주로 디버깅에 사용됩니다.

문제 해결

Windows의 기본 설치에서 ASP.NET 작업자 프로세스에서 웹 애플리케이션 코드를 실행합니다. 이 프로세스의 ID는 기본적으로 ASPNET 계정이라는 권한 없는 로컬 계정으로 설정됩니다. ASP.NET 베타 릴리스에서 프로세스 ID는 시스템에 대한 많은 권한을 가진 강력한 관리 계정인 시스템이었습니다.

WINDOWS Server(IIS)의 기본 설치에서 ASP.NET 작업자 프로세스에서 웹 애플리케이션 코드를 실행합니다. 이 프로세스의 ID는 기본적으로 NetworkService라는 제한된 계정으로 설정됩니다.

이 변경 내용 및 이 문서의 코드 실행에 미치는 영향과 추가 액세스 권한이 필요할 수 있는 다른 코드에 대한 자세한 내용은 패턴 & 사례를 참조하세요.

참조