2012-12-03 1 views
2

, 나는이 방법을 가지고있다. 아무 래도 HttpException이 던졌습니다. 시스템이 Index에 대한 요청을 처리 한 후HttpNotFoundResult가 HttpException을 던집니다. 방법은 호출되고</p> <pre><code>public ActionResult Index() { System.Diagnostics.Debug.Write("Index"); return new HttpNotFoundResult(); } </code></pre> <p>('지수'가 출력된다) : 테스트 목적으로

void Application_Error(object sender, EventArgs e) 
{ 
    Exception exc = Server.GetLastError(); 
    if (exc is System.Web.HttpException) 
    { 
     string msg = "UrlReferrer: " 
      + Context.Request.UrlReferrer + " UserAgent: " + Context.Request.UserAgent 
      + " UserHostAddress: " + Context.Request.UserHostAddress + " UserHostName: " 
      + Context.Request.UserHostName; 

     ErrorHandler.Error(exc.Message, msg); 
    } 
    else { 
     ... 
    } 
} 

이 메소드가 호출되고 내 Global.asax 파일에서 나는 Application_Error 구현을 가지고있다. 이 측면 스테핑 내 컨트롤러에 OnException 처리기 한, 혹은 예외가 404

이 매우 성가신의 상태 코드로 어떤 ActionResult 위해 발생합니다 - 나는 HttpNotFoundResult는 예외가 발생하는 원인이 있다고 생각합니다. 내 웹 사이트의 경우 Application_Error은 최후의 실수가 아니며 대부분의 정상적인 오류는 다른 장소 (컨트롤러 또는 작업 필터)에서 처리하도록되어 있습니다. 난 단지 Application_Error 예기치 않은 예외 또는 이미지 또는 .js 파일과 같은 것들에 대한 404s를 기록 싶어요.

프로그래밍 방식으로 생성 된 404s에 대한 예외를 throw하지 않도록 asp.net을 중지 할 수있는 방법이 있습니까? 또는 HttpException이 프로그램 적으로 생성 된 404 원인 일 경우 Application_Error에서 확인할 방법이 있습니까?

답변

2

모든 작업에서 발생하는 404 예외를 처리하는 사용자 지정 예외 필터를 만들 수 있습니다. HttpContext.Items 콜렉션을 사용하여 프로그램 적으로 제기 된 404인지 여부를 추적 할 수 있습니다.

사용자 정의 예외 필터는

public class NotFoundExceptionFilter : IExceptionFilter 
{   
    public void OnException(ExceptionContext filterContext) 
    { 
     // ignore if the exception is already handled or not a 404 
     if (filterContext.ExceptionHandled || new HttpException(null, filterContext.Exception).GetHttpCode() != 404) 
      return; 

     filterContext.HttpContext.Items.Add("Programmatic404", true); 
     filterContext.ExceptionHandled = true; 
    } 
} 

당신은 글로벌 필터로 NotFoundExceptionFilter를 적용해야합니다.

함으로써 Application_Error 이벤트는

public static void Application_Error(object sender, EventArgs e) 
{ 
    var httpContext = ((MvcApplication)sender).Context; 

    // ignore if it is a programatically raised 404 
    if(httpContext.Items["Programmatic404"] != null && bool.Parse(httpContext.Items["Programmatic404"].ToString())) 
     return; 

    // else, Log the exception 
} 
+0

이 꽤 깔끔한 아이디어, 그리고 실제로 내 다른 문제를 해결합니다. 그러나, asp.net에 의해 발생 된'HttpException'은 예외 필터에 도달하지 않습니다. 예외가 컨트롤러 외부에서 발생하는 것 같습니다. 따라서이 솔루션은 여기서 작동하지 않습니다. – Oliver

+0

@Oliver 예외가 발생하면 컨트롤러 외부로 던져 집니까? 나는 당신이 내장 HandleError가 500이 아닌 HTTP 예외를 처리하지 않는다는 사실을 알고 있다고 생각한다. – VJAI

+0

asp.net 스택의 어떤 시점에서 응답에 404의 상태 코드가 있는지를 확인한다. 이 경우 HttpException을 던집니다. 'OnException' 이벤트가 발생하지 않기 때문에 컨트롤러가 소비되고 폐기되면 이것이 발생해야한다고 생각합니다. 그래서 여기에서 예외 필터는'OnException' 메소드가 호출되지 않았기 때문에'HttpException'을 탐지하지 않는 것처럼 보입니다. 그러나 액션 메소드 내부에서 수동으로 발생하는 HttpException을 감지합니다. – Oliver

관련 문제