2010-06-25 4 views
9

그래,이 문제에 난처한 상황입니다. 나는이 문제를 해결해야 할 많은 일들을 보았지만 나의 요구 사항을 충족시킬 수있는 해결책을 얻지 못하고있다.존재하지 않는 컨트롤러에 대해 예외가 발생하지 않도록 하시겠습니까?

ELMAH를 사용하여 예외를 기록하고 있으며 잘못된 컨트롤러 또는 적절한 컨트롤러 및 잘못된 동작이있는 URL이있을 때이 예외가 발생합니다.

System.Web.HttpException: The controller for path '/BadController' was not found or does not implement IController. 
    at System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) 
    at System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) 
    at System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) 
    at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) 
    at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) 
    at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) 
    at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
    at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 

예외가 발생하지 않도록하고 싶습니다. 사용자 지정 오류를 사용하고 있으며 응용 프로그램이 내 사용자 지정 404 오류 페이지로 보낼 때 제대로 작동합니다. 그러나 예외는 여전히 기록됩니다.

모든 컨트롤러를 장식하는 [HandleError] 속성이 있습니다. 이것이 가능한가? 그렇다면 어떤 도움을 주시면 감사하겠습니다.

나는 final route that redirects을 설정하려고했지만 어떤 이유로 든 이전 경로와 일치합니다. httpModule을 사용하고 Global.asax 파일의 Application_Error 이벤트를 지우려고 시도했습니다. 그 예외를 막는 것은 아무것도 없습니다.

도움을 주셔서 다시 한 번 감사드립니다!

+0

로깅되는 것이 좋지 않니? 일반 404는 기본적으로 Apache에 로그인되어 있습니다. –

+0

로깅이 그렇게 많은 것은 아니지만 스쿼시를 시도하는 것은 예외입니다. 나는 404 에러가되기를 원하지만 404 에러가 발생한다. .NET customErrors가 404 에러를 발생시키고 아무런 예외도 발생시키지 않는 이상적인 상황이다. –

답변

1

이 예외와 관련하여 엄청난 양의 파문이 던져 졌을 가능성이 높습니다. 이에 대한 대답은 article에 따라 ELMAH에서 예외를 제외하는 것입니다. 기본적으로

는 ELMAH는 (404) 및 기타 HTTP 오류를 포함 모든 처리되지 않은 예외의 세부 사항을 기록합니다. ELMAH가이 오류를 무시하도록 지시하거나 다른 유형의 오류를 필터링을 사용하여 지정할 수 있습니다.

+0

[이 기사] (http : //www.diaryofaninja.co.kr/blog/2011/09/20/adding-filters-to-your-elmah 설치) 정확히 내가 뭘 찾고 있었는지, 오류를 로그하지만 나에게 이메일을 보내지 마라. –

2

요청한 컨트롤러를 찾지 못한 경우 원하는 기능을 실행할 수있는 사용자 정의 컨트롤러 팩토리를 연결합니다. 몇 줄의 코드 일 뿐이며 고통스럽지 않습니다.

컨트롤러 팩토리를 롤하거나 여러 라이브러리 중 하나를 시작점으로 사용할 수 있습니다. IControllerFactory를 구현하는 클래스가 있고 CreateController() 함수는 사용자 정의 로직이됩니다.

0

나는 DSO's ITCloud Contrib을 사용합니다. 그 중 {controller}/{action} 일반 매개 변수가 없습니다. 각 동작 방법에 대해 명시적인 UrlRoute 특성 메서드 바로 위에 매개 변수 제약 조건이 표시되는 것을 좋아합니다.

4

컨트롤러가 있는지 (사실 가능한 컨트롤러를 모두 스캔하여 캐시하고 실제로 무엇을 의미하는지 알고 있음) RouteConstraint를 작성하여 표준 경로에 추가하십시오.

그래서 나쁜 컨트롤러에 대한 요청이있을 때 정상적인 Route에서는 허용되지 않습니다. 하지만 catchall -> 404 경로에 의해 승인되었습니다.

관련 문제