사용자 지정 오류 페이지 표시(VB)

작성자 : Scott Mitchell

ASP.NET 웹 애플리케이션에서 런타임 오류가 발생할 때 사용자에게 표시되는 내용은 무엇인가요? 대답은 웹 사이트의 <customErrors> 구성 방법에 따라 달라집니다. 기본적으로 사용자에게 런타임 오류가 발생했음을 나타내는 보기 흉한 노란색 화면이 표시됩니다. 이 자습서에서는 이러한 설정을 사용자 지정하여 사이트의 모양과 느낌에 맞는 심미적으로 만족스러운 사용자 지정 오류 페이지를 표시하는 방법을 보여 줍니다.

소개

완벽한 세상에서는 런타임 오류가 없을 것입니다. 프로그래머는 버그와 강력한 사용자 입력 유효성 검사를 사용하여 코드를 작성하며 데이터베이스 서버 및 전자 메일 서버와 같은 외부 리소스는 오프라인 상태가 되지 않습니다. 물론, 현실에서 오류는 피할 수 없습니다. .NET Framework 클래스는 예외를 throw하여 오류를 표시합니다. 예를 들어 SqlConnection 개체의 Open 메서드를 호출하면 연결 문자열로 지정된 데이터베이스에 대한 연결이 설정됩니다. 그러나 데이터베이스가 다운되었거나 연결 문자열의 자격 증명이 유효하지 않은 경우 Open 메서드는 을 SqlExceptionthrow합니다. 예외는 블록을 사용하여 Try/Catch/Finally 처리할 수 있습니다. 블록 내의 코드가 예외를 Try throw하면 개발자가 오류로부터 복구를 시도할 수 있는 적절한 catch 블록으로 컨트롤이 전송됩니다. 일치하는 catch 블록이 없거나 예외를 throw한 코드가 try 블록에 없는 경우 예외는 블록을 검색 Try/Catch/Finally 하여 호출 스택을 표시합니다.

예외가 처리HttpApplication되지 않고 ASP.NET 런타임까지 버블링되면 클래스의 Error 이벤트가 발생하고 구성된 오류 페이지가 표시됩니다. 기본적으로 ASP.NET YSOD( 노란색 죽음의 화면 )라고 하는 오류 페이지를 표시합니다. YSOD에는 두 가지 버전이 있습니다. 하나는 예외 세부 정보, 스택 추적 및 애플리케이션을 디버깅하는 개발자에게 유용한 기타 정보를 보여 줍니다( 그림 1 참조). 다른 하나는 단순히 런타임 오류가 있음을 나타냅니다( 그림 2 참조).

예외 세부 정보 YSOD는 애플리케이션을 디버깅하는 개발자에게 매우 유용하지만 최종 사용자에게 YSOD를 표시하는 것은 끈적끈적하고 전문적이지 않습니다. 대신, 최종 사용자는 상황을 설명하는 보다 사용자에게 친숙한 산문으로 사이트의 모양과 느낌을 유지하는 오류 페이지로 이동해야 합니다. 좋은 소식은 이러한 사용자 지정 오류 페이지를 만드는 것이 매우 쉽다는 것입니다. 이 자습서는 ASP 살펴보기부터 시작합니다. NET의 다른 오류 페이지입니다. 그런 다음, 오류가 발생할 경우 사용자에게 사용자 지정 오류 페이지를 표시하도록 웹 애플리케이션을 구성하는 방법을 보여줍니다.

세 가지 유형의 오류 페이지 검사

ASP.NET 애플리케이션에서 처리되지 않은 예외가 발생하면 다음 세 가지 유형의 오류 페이지 중 하나가 표시됩니다.

  • 예외 세부 정보 노란색 사망 화면 오류 페이지
  • 런타임 오류 노란색 사망 화면 오류 페이지 또는
  • 사용자 지정 오류 페이지

개발자가 가장 잘 알고 있는 오류 페이지는 예외 세부 정보 YSOD입니다. 기본적으로 이 페이지는 로컬로 방문하는 사용자에게 표시되므로 개발 환경에서 사이트를 테스트할 때 오류가 발생할 때 표시되는 페이지입니다. 이름에서 알 수 있듯이 예외 세부 정보 YSOD는 예외에 대한 세부 정보(형식, 메시지 및 스택 추적)를 제공합니다. 또한 ASP.NET 페이지의 코드 숨김 클래스에서 코드에 의해 예외가 발생한 경우 및 애플리케이션이 디버깅을 위해 구성된 경우 예외 세부 정보 YSOD는 이 코드 줄(그리고 그 위와 아래에 몇 줄의 코드)도 표시합니다.

그림 1 은 예외 세부 정보 YSOD 페이지를 보여 줍니다. 브라우저의 주소 창에서 URL을 확인합니다 http://localhost:62275/Genre.aspx?ID=foo. 페이지에는 Genre.aspx 특정 장르의 책 리뷰가 나열되어 있습니다. 쿼리 문자열을 GenreId 통해 값(a uniqueidentifier)을 전달해야 합니다. 예를 들어 소설 검토를 볼 수 있는 적절한 URL은 입니다 Genre.aspx?ID=7683ab5d-4589-4f03-a139-1c26044d0146. 쿼리 문자열(예: "foo")을 통해 비 값uniqueidentifier 이 전달되면 예외가 throw됩니다.

참고

다운로드할 수 있는 데모 웹 애플리케이션에서 이 오류를 재현하려면 를 직접 방문 Genre.aspx?ID=foo 하거나 에서 Default.aspx"런타임 오류 생성" 링크를 클릭할 수 있습니다.

그림 1에 표시된 예외 정보를 확인합니다. "문자열을 uniqueidentifier로 변환할 때 변환이 실패했습니다."라는 예외 메시지가 페이지 맨 위에 있습니다. 예외의 형식인 System.Data.SqlClient.SqlException도 나열됩니다. 스택 추적도 있습니다.

예외에 대한 정보를 보여 주는 스크린샷

그림 1: 예외 세부 정보 YSOD에는 예외에 대한 정보가 포함되어 있습니다.
(전체 크기 이미지를 보려면 클릭)

다른 유형의 YSOD는 런타임 오류 YSOD이며 그림 2에 표시됩니다. 런타임 오류 YSOD는 런타임 오류가 발생했음을 방문자에게 알리지만 throw된 예외에 대한 정보는 포함하지 않습니다. 그러나 이러한 YSOD가 전문적이지 않은 것처럼 보이게 하는 파일의 일부인 파일을 수정하여 Web.config 오류 세부 정보를 볼 수 있도록 하는 방법에 대한 지침을 제공합니다.

기본적으로 런타임 오류 YSOD는 그림 2http://httpruntime.web703.discountasp.net/Genre.aspx?ID=foo브라우저 주소 표시줄에 있는 URL에 의해 입증된 대로 를 통해 http://www.yoursite.com원격으로 방문하는 사용자에게 표시됩니다. 두 개의 서로 다른 YSOD 화면은 개발자가 오류 세부 정보를 알고 싶어하기 때문에 존재하지만, 이러한 정보는 잠재적인 보안 취약성 또는 사이트를 방문하는 사람에게 다른 중요한 정보를 노출할 수 있으므로 라이브 사이트에 표시되지 않아야 합니다.

참고

따라가고 DiscountASP.NET 웹 호스트로 사용하는 경우 라이브 사이트를 방문할 때 런타임 오류 YSOD가 표시되지 않는 것을 알 수 있습니다. DiscountASP.NET 기본적으로 예외 세부 정보 YSOD를 표시하도록 구성된 서버가 있기 때문입니다. 좋은 소식은 파일에 섹션을 추가하여 이 기본 동작을 재정의 <customErrors> 할 수 있다는 것입니다 Web.config . "표시되는 오류 페이지 구성" 섹션에서는 섹션을 <customErrors> 자세히 살펴봅니다.

런타임 오류 YSOD에 오류 세부 정보가 포함되지 않는 방법을 보여 주는 스크린샷

그림 2: 런타임 오류 YSOD에 오류 세부 정보가 포함되지 않음
(전체 크기 이미지를 보려면 클릭)

세 번째 유형의 오류 페이지는 사용자가 만든 웹 페이지인 사용자 지정 오류 페이지입니다. 사용자 지정 오류 페이지의 이점은 페이지의 모양과 느낌과 함께 사용자에게 표시되는 정보를 완전히 제어할 수 있다는 것입니다. 사용자 지정 오류 페이지는 다른 페이지와 동일한 master 페이지 및 스타일을 사용할 수 있습니다. "사용자 지정 오류 페이지 사용" 섹션에서는 사용자 지정 오류 페이지를 만들고 처리되지 않은 예외가 발생할 경우 표시되도록 구성하는 방법을 안내합니다. 그림 3 에서는 이 사용자 지정 오류 페이지의 최대치를 제공합니다. 당신이 볼 수 있듯이, 오류 페이지의 모양과 느낌은 그림 1과 2에 표시된 죽음의 노란색 화면 중 하나보다 훨씬 더 전문적인 모습입니다.

보다 맞춤화된 모양과 느낌을 제공하기 위해 만들 수 있는 사용자 지정 오류 페이지를 보여 주는 스크린샷.

그림 3: 사용자 지정 오류 페이지는 보다 맞춤화된 모양과 느낌을 제공합니다.
(전체 크기 이미지를 보려면 클릭)

잠시 시간을 내 어 그림 3에서 브라우저의 주소 표시줄을 검사합니다. 주소 표시줄에는 사용자 지정 오류 페이지(/ErrorPages/Oops.aspx)의 URL이 표시됩니다. 그림 1과 2에서는 오류가 발생한 것과 동일한 페이지에 노란색 죽음의 화면이 표시됩니다(Genre.aspx). 사용자 지정 오류 페이지는 querystring 매개 변수를 통해 오류가 발생한 페이지의 URL을 aspxerrorpath 전달합니다.

표시되는 오류 페이지 구성

표시되는 세 가지 오류 페이지 중 두 변수를 기반으로 하는 오류 페이지는 다음과 같습니다.

  • 섹션의 <customErrors> 구성 정보 및
  • 사용자가 로컬 또는 원격으로 사이트를 방문하는지 여부입니다.

<customErrors>Web.config 섹션에는 표시되는 defaultRedirect 오류 페이지에 영향을 주는 두 가지 특성인 및 mode가 있습니다. defaultRedirect 특성은 선택 사항입니다. 제공된 경우 사용자 지정 오류 페이지의 URL을 지정하고 런타임 오류 YSOD 대신 사용자 지정 오류 페이지를 표시해야 했음을 나타냅니다. 특성은 mode 필수이며 , Off또는 RemoteOnly의 세 가지 On값 중 하나를 허용합니다. 이러한 값에는 다음과 같은 동작이 있습니다.

  • On - 사용자 지정 오류 페이지 또는 런타임 오류 YSOD가 로컬 또는 원격인지에 관계없이 모든 방문자에게 표시됨을 나타냅니다.
  • Off - 예외 세부 정보 YSOD가 로컬인지 원격인지에 관계없이 모든 방문자에게 표시되도록 지정합니다.
  • RemoteOnly - 예외 세부 정보 YSOD가 로컬 방문자에게 표시되는 동안 사용자 지정 오류 페이지 또는 런타임 오류 YSOD가 원격 방문자에게 표시됨을 나타냅니다.

달리 지정하지 않는 한 ASP.NET 모드 특성을 RemoteOnly 로 설정하고 값을 지정 defaultRedirect 하지 않은 것처럼 작동합니다. 즉, 런타임 오류 YSOD가 원격 방문자에게 표시되는 동안 예외 세부 정보 YSOD가 로컬 방문자에게 표시되는 것이 기본 동작입니다. 웹 애플리케이션에 섹션을 추가하여 이 기본 동작을 <customErrors> 재정의할 수 있습니다. Web.config file.

사용자 지정 오류 페이지 사용

모든 웹 애플리케이션에는 사용자 지정 오류 페이지가 있어야 합니다. 런타임 오류 YSOD에 대한 보다 전문적인 대안을 제공하고, 쉽게 만들 수 있으며, 사용자 지정 오류 페이지를 사용하도록 애플리케이션을 구성하는 데 몇 분밖에 걸리지 않습니다. 첫 번째 단계는 사용자 지정 오류 페이지를 만드는 것입니다. 라는 Book Reviews 애플리케이션에 새 폴더를 추가하고 라는 ErrorPages 새 ASP.NET 페이지에 Oops.aspx추가했습니다. 동일한 모양과 느낌을 자동으로 상속할 수 있도록 페이지에서 사이트의 나머지 페이지와 동일한 master 페이지를 사용하도록 합니다.

Oops 점이 포함된 ErrorPages 폴더를 보여 주는 스크린샷s p x 파일.

그림 4: 사용자 지정 오류 페이지 만들기

다음으로, 몇 분 동안 오류 페이지에 대한 콘텐츠를 만듭니다. 예기치 않은 오류가 발생했음을 나타내는 메시지와 사이트의 홈페이지에 대한 링크가 포함된 다소 간단한 사용자 지정 오류 페이지를 만들었습니다.

사용자 고유의 사용자 지정 오류 페이지를 디자인하는 방법을 보여 주는 스크린샷

그림 5: 사용자 지정 오류 페이지 디자인
(전체 크기 이미지를 보려면 클릭)

오류 페이지가 완료되면 런타임 오류 YSOD 대신 사용자 지정 오류 페이지를 사용하도록 웹 애플리케이션을 구성합니다. 이 작업은 섹션 defaultRedirect 의 특성에서 오류 페이지의 URL을 <customErrors> 지정하여 수행됩니다. 애플리케이션의 Web.config 파일에 다음 태그를 추가합니다.

<configuration>
    ...

    <system.web>
        <customErrors mode="RemoteOnly"
                      defaultRedirect="~/ErrorPages/Oops.aspx" />

        ...
    </system.web>
</configuration>

위의 태그는 원격으로 방문하는 사용자에 대해 사용자 지정 오류 페이지 Oops.aspx를 사용하는 동안 로컬로 방문하는 사용자에게 예외 세부 정보 YSOD를 표시하도록 애플리케이션을 구성합니다. 이 동작을 확인하려면 프로덕션 환경에 웹 사이트를 배포한 다음, 잘못된 querystring 값이 있는 라이브 사이트의 Genre.aspx 페이지를 방문하세요. 사용자 지정 오류 페이지가 표시됩니다( 그림 3 참조).

사용자 지정 오류 페이지가 원격 사용자에게만 표시되는지 확인하려면 개발 환경에서 잘못된 쿼리 문자열이 있는 페이지를 방문 Genre.aspx 하세요. 예외 세부 정보 YSOD가 계속 표시됩니다( 그림 1 참조). 이 RemoteOnly 설정을 사용하면 프로덕션 환경의 사이트를 방문하는 사용자에게 사용자 지정 오류 페이지가 표시되며, 로컬로 작업하는 개발자는 예외의 세부 정보를 계속 볼 수 있습니다.

개발자에게 알림 및 로깅 오류 세부 정보

개발 환경에서 발생하는 오류는 개발자가 컴퓨터에 앉아 있었기 때문에 발생했습니다. 예외 세부 정보 YSOD에 예외 정보가 표시되고 오류가 발생했을 때 수행된 단계를 알고 있습니다. 그러나 프로덕션 환경에서 오류가 발생하면 사이트를 방문하는 최종 사용자가 오류를 보고하는 데 시간이 걸리지 않는 한 개발자는 오류가 발생했음을 알지 않습니다. 또한 사용자가 개발 팀에 오류가 발생했음을 알리는 데 방해가 되더라도 예외 유형, 메시지 및 스택 추적을 알지 못하면 오류의 원인을 진단하기 어려울 수 있습니다.

이러한 이유로 프로덕션 환경의 모든 오류가 일부 영구 저장소(예: 데이터베이스)에 기록되고 개발자에게 이 오류에 대한 경고가 표시되는 것이 가장 중요합니다. 사용자 지정 오류 페이지는 이 로깅 및 알림을 수행하는 데 적합한 위치처럼 보일 수 있습니다. 아쉽게도 사용자 지정 오류 페이지에는 오류 세부 정보에 액세스할 수 없으므로 이 정보를 기록하는 데 사용할 수 없습니다. 좋은 소식은 오류 세부 정보를 가로채서 기록하는 여러 가지 방법이 있다는 것입니다. 다음 세 가지 자습서에서는 이 항목을 더 자세히 살펴봅니다.

다른 HTTP 오류 상태에 다른 사용자 지정 오류 페이지 사용

ASP.NET 페이지에서 예외가 throw되고 처리되지 않으면 구성된 오류 페이지가 표시되는 ASP.NET 런타임까지 예외가 표시됩니다. 요청이 ASP.NET 엔진에 들어오지만 어떤 이유로 처리할 수 없는 경우(요청된 파일을 찾을 수 없거나 파일에 대한 읽기 권한이 비활성화된 경우) ASP.NET 엔진은 을 HttpException발생합니다. 이 예외는 ASP.NET 페이지에서 발생한 예외와 마찬가지로 런타임까지 버블링되어 적절한 오류 페이지가 표시됩니다.

프로덕션의 웹 애플리케이션에 대한 의미는 사용자가 찾을 수 없는 페이지를 요청하면 사용자 지정 오류 페이지가 표시된다는 것입니다. 그림 6 은 이러한 예제를 보여줍니다. 요청이 존재하지 않는 페이지(NoSuchPage.aspx)에 대한 요청이므로 이 HttpException throw되고 사용자 지정 오류 페이지가 표시됩니다(querystring 매개 변수에 aspxerrorpath 참조 NoSuchPage.aspx 참고).

구성된 오류 페이지가 표시되는 스크린샷그림 6: ASP.NET 런타임이 잘못된 요청에 대한 응답으로 구성된 오류 페이지를 표시합니다.
(전체 크기 이미지를 보려면 클릭)

기본적으로 모든 유형의 오류로 인해 동일한 사용자 지정 오류 페이지가 표시됩니다. 그러나 섹션 내 <customErrors> 의 자식 요소를 사용하여 특정 HTTP 상태 코드에 대해 <error> 다른 사용자 지정 오류 페이지를 지정할 수 있습니다. 예를 들어 HTTP 상태 코드가 404인 페이지를 찾을 수 없는 오류가 발생할 경우 다른 오류 페이지가 표시되도록 섹션을 업데이트 <customErrors> 하여 다음 태그를 포함합니다.

<customErrors mode="RemoteOnly" defaultRedirect="~/ErrorPages/Oops.aspx">
    <error statusCode="404" redirect="~/ErrorPages/404.aspx" />
</customErrors>

이 변경 내용이 적용되면 원격으로 방문하는 사용자가 존재하지 않는 ASP.NET 리소스를 요청할 때마다 가 아닌 Oops.aspx사용자 지정 오류 페이지로 404.aspx 리디렉션됩니다. 그림 7에서 알 수 있듯이 페이지에는 404.aspx 일반 사용자 지정 오류 페이지보다 더 구체적인 메시지가 포함될 수 있습니다.

참고

효과적인 404 오류 페이지를 만드는 방법에 대한 지침은 404 오류 페이지, 한 번 더 확인하세요.

표시되는 변색된 메시지를 보여 주는 스크린샷그림 7: 사용자 지정 404 오류 페이지에 보다 더 많은 대상 메시지가 표시됩니다. Oops.aspx
(전체 크기 이미지를 보려면 클릭)

사용자가 찾을 수 없는 페이지에 대한 요청을 할 때만 페이지에 도달한다는 것을 알고 404.aspx 있으므로 사용자가 이 특정 유형의 오류를 해결하는 데 도움이 되는 기능을 포함하도록 이 사용자 지정 오류 페이지를 향상시킬 수 있습니다. 예를 들어 알려진 잘못된 URL을 좋은 URL에 매핑하는 데이터베이스 테이블을 빌드한 다음 404.aspx 사용자 지정 오류 페이지에서 해당 테이블에 대해 쿼리를 실행하고 사용자가 도달하려고 할 수 있는 페이지를 제안하도록 할 수 있습니다.

참고

사용자 지정 오류 페이지는 ASP.NET 엔진에서 처리하는 리소스에 대한 요청이 있을 때만 표시됩니다. IIS와 ASP.NET 개발 서버 간의 핵심 차이점 자습서에서 설명한 대로 웹 서버는 특정 요청 자체를 처리할 수 있습니다. 기본적으로 IIS 웹 서버는 ASP.NET 엔진을 호출하지 않고 이미지 및 HTML 파일과 같은 정적 콘텐츠에 대한 요청을 처리합니다. 따라서 사용자가 존재하지 않는 이미지 파일을 요청하면 ASP가 아닌 IIS의 기본 404 오류 메시지가 다시 표시됩니다. NET의 구성된 오류 페이지입니다.

요약

ASP.NET 애플리케이션에서 처리되지 않은 예외가 발생하면 사용자에게 세 가지 오류 페이지 중 하나가 표시됩니다. 예외 세부 정보 사망의 노란색 화면; 런타임 오류 노란색 죽음의 화면; 또는 사용자 지정 오류 페이지입니다. 표시되는 오류 페이지는 애플리케이션의 <customErrors> 구성과 사용자가 로컬 또는 원격으로 방문하는지 여부에 따라 달라집니다. 기본 동작은 예외 세부 정보 YSOD를 로컬 방문자에게 표시하고 런타임 오류 YSOD를 원격 방문자에게 표시하는 것입니다.

런타임 오류 YSOD는 사이트를 방문하는 사용자로부터 잠재적으로 중요한 오류 정보를 숨기지만 사이트의 모양과 느낌에서 벗어나 애플리케이션을 버그처럼 보이게 합니다. 더 나은 방법은 사용자 지정 오류 페이지를 만들고 디자인하고 섹션의 defaultRedirect 특성에 <customErrors> 해당 URL을 지정하는 사용자 지정 오류 페이지를 사용하는 것입니다. 다른 HTTP 오류 상태에 대해 여러 사용자 지정 오류 페이지를 가질 수도 있습니다.

사용자 지정 오류 페이지는 프로덕션 환경에서 웹 사이트에 대한 포괄적인 오류 처리 전략의 첫 번째 단계입니다. 개발자에게 오류를 알리고 세부 정보를 기록하는 것도 중요한 단계입니다. 다음 세 자습서에서는 오류 알림 및 로깅에 대한 기술을 살펴봅니다.

행복한 프로그래밍!

추가 정보

이 자습서에서 설명하는 topics 대한 자세한 내용은 다음 리소스를 참조하세요.