2009-07-14 2 views
1

Application_Error 이벤트를 사용하여 내 앱에서 오류를 포착하고 기록합니다. 내 Web.config의에서 ASP.NET 응용 프로그램 오류가 404를 재정의합니까?

Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs) 
     Dim ex As New Exception(_ 
      String.Format("Error on page: '{0}'.", HttpContext.Current.Request.Url), _ 
      Server.GetLastError()) 

     Dim uid As Guid = Log.FatalError(ex) 
     Server.Transfer(String.Concat("~\\GlobalError.aspx?error=", uid)) 
End Sub 

내가 가진 : 오류는 친절한 에러 화면이 표시되고 기록됩니다

사용자가 존재하지 않는 페이지를로드하려고 할 때마다
<customErrors mode="On" defaultRedirect="GlobalError.aspx"> 
    <error statusCode="404" redirect="PageNotFound.aspx" /> 
</customErrors> 

, 그들은 GlobalError.aspx 페이지를 가져오고 PageNotFound.aspx 페이지는 가져 오지 마십시오. Application_Error 이벤트를 살펴보면 Response StatusCode가 200이고 서버의 마지막 오류는 "Page 'foo.aspx'를 찾을 수 없다는 것을 알았습니다."

제대로 작동하려면 어떻게해야합니까?

답변

3

Error가 page not found/404 오류가 아닌 경우 Application_Error 함수에서 Server.Transfer 만 사용해야합니다. 이러한 경우 ASP.NET으로 이동하여 web.config의 설정을 사용하여 리디렉션을 수행합니다. 그것은 다음과 같은 사용하여 (404)의 경우

당신은 알아낼 수있다 : 나는 defaulRedirect를 제거하면

Exception ex = Server.GetLastError(); 
if (ex.GetType() == typeof(HttpException)) 
{ 
    HttpException httpEx = (HttpException)ex; 
    if(httpEx.GetHttpCode() == 404) { 
    return; 
    } 
} 
Server.Transfer("~/error.aspx"); 
+0

이것에 대해 생각했지만 페이지가 발견되지 않더라도 StatusCode는 404가 아닌 200입니다. –

+0

404 오류인지 감지하는 스 니펫을 추가했습니다 –

+0

이것은 하나의 코드로 작동합니다. 기대하지만, 서투른 것처럼 보인다, 안 그래? 왜 이것을 알아 내야합니까? 왜 web.config가 예상대로 작동하지 않습니까? –

0

먼저 GlobalError.aspx를 얻는 이유를 결정해야합니다. 당신은 우리에게 두 가지 가능성을 보여주었습니다. 어쩌면 더 많은 것이 있습니다.

이러한 항목 중 하나의 이름을 GlobalErrorX.aspx로 변경하고 어떤 일이 발생하는지 확인하십시오.

+0

, 그것은 같은 장소에 사용자를 푸시합니다. 분명히 파일에 대한 두 개의 참조가 중복됩니다. –

+0

방금 ​​404가 오류 페이지를 찾을 수 없다는 것을 알게되었습니다. IIS 로그를 확인하십시오. –

+0

아니요, 404 페이지가 직접로드되고 로그에 foo.aspx가 없다고 표시됩니다. 문제는 실제로 "영리한"사용자와 관련이 있습니다. bar.aspx라는 페이지를 사용합니다. 클라이언트 사이트에서 "bar"는 "foo"라고합니다. bar.aspx를로드하면 "Foo"라는 큰 제목이 표시됩니다. 이는 언어 사전과 유사하게 처리하는 다양한 클라이언트 간의 차이에 불과합니다. 문제는 foo.aspx를 직접로드하려고 시도하고 foo.aspx가 깨 졌다고 생각하게 만드는 오류 화면이 표시된다는 것입니다. 사실 foo.aspx가 존재하지 않는다는 것을 오류가 의미한다고 생각할 때 . –