ASP.NET MVC 3의 사용자 지정 오류 처리에 대한 결정적인 지침은 무엇입니까?


44

ASP.NET MVC (이 경우 3)에서 사용자 지정 오류 처리 프로세스는 무시되는 것처럼 보입니다. 나는 웹에서 Elmah와 같은 다양한 도구에 대한 도움말 페이지의 다양한 질문과 답변을 읽었지만 완전한 서클에 들어가서 여전히 최상의 해결책이없는 것처럼 느낍니다. 귀하의 도움으로 오류 처리를위한 새로운 표준 접근 방식을 설정할 수 있습니다. 나는 이것을 과도하게 엔지니어링하지 않고 단순하게 유지하고 싶습니다.

내 목표는 다음과 같습니다.

서버 오류 / 예외의 경우 :

  1. dev에 디버깅 정보 표시
  2. 생산시 친숙한 오류 페이지 표시
  3. 오류를 기록하고 프로덕션 관리자에게 이메일로 보냅니다.
  4. 500 HTTP 상태 코드를 반환

404 Not Found 오류의 경우 :

  1. 친숙한 오류 페이지 표시
  2. 오류를 기록하고 프로덕션 관리자에게 이메일로 보냅니다.
  3. 404 HTTP 상태 코드를 반환

ASP.NET MVC로 이러한 목표를 달성 할 수있는 방법이 있습니까?


2
이 질문을 다시 SO로 마이그레이션하여 더 많은 답변을 얻을 수 있기를 바랍니다. 코딩 된 답변을 찾고 있습니다.
Shawn Mclean

@Shawn 일어날 가능성이 적습니다. 문제는 여기에있는 것보다 여기에 더 많은 주제가 있으며 허용되는 답변이 있습니다. 기술적 인 이유로 질문은 다시 마이그레이션되지 않습니다. 특정 오류 처리 방법을 코딩하는 데 도움이 필요한 경우 StackOverflow에 대한 새 질문을여십시오. 그렇지 않으면 "코딩 된 답변"이 너무 광범위하여 유용하거나 대답 할 수없는 기준이 될 수 있습니다. 마지막으로, 질문에 중재자의 관심을 끄는 가장 좋은 방법은 질문에 플래그를 지정하는 것입니다. 댓글 수를 20 개 이상 밀어서 자동 플래그를 트립하지 않았다면 여기에있는 귀하의 의견이 눈에 띄지 않았을 것입니다.
Adam Lear

여기에 약 10 개의 의견이있었습니다. 모두 어디로 갔습니까?
RyanW

목표에 맞는 솔루션을 찾았습니다. SO에 대한 또 다른 대답으로 stackoverflow.com/questions/6508415/…
Jesse Webb

1
@AnnaLear 나는 Shawn과 동의합니다. Google을 통해서만이 페이지를 찾았습니다. 아래의 거의 모든 답변에는 BACK to Stack Overflow 링크가 포함되어 있습니다. 볼륨을 말하는 저에게는 그것이 처음에 그곳에 있어야했기 때문입니다.
Rebecca

답변:


23

나는이 일을 끝내는 방식을 공유 할 것입니다. 원래 질문의 일부였습니다.

첫째, 내가 겪은 문제 :

  1. customErrors가 켜져 있으면 (즉, 프로덕션 환경에서) 전역 HandleError속성은 예외를 삼키고 오류보기를 렌더링하지만 elmah는이를 볼 수 없기 때문에 elmah와 같은 애드온 도구를 사용하여이를 기록 할 수 없습니다. 내가 생각 한대로 로그에 기록 할 수는 있지만, 그것은 잘못된 것 같습니다. 글로벌 HandleError 특성은 MVC 3 RTM Visual Studio 프로젝트 템플릿에서 새로 나타납니다.

  2. MVC 엔드 포인트에 대한 URL이있는 customErrors는 302 상태 코드를 반환합니다. redirectmode 속성이 있지만 customErrors에서 mvc url을 일치시키고 ResponseRewrite 모드를 사용할 수 없습니다. ( https://stackoverflow.com/questions/781861/customerrors-does-not-work-when-setting-redirectmode-responserewrite/3770265#3770265 )

  3. customErrors를 완전히 피하고 앱의 모든 사용자 지정 항목을 처리하면 IMO가 복잡해집니다. (나는 이것을 좋아했다 : https://stackoverflow.com/questions/619895/how-can-i-properly-handle-404s-in-asp-net-mvc/2577095#2577095 , 그러나 우리 프로젝트에는 적합하지 않았다)

내 솔루션

방정식에서 MVC를 완전히 제거했습니다. HandleErrorAttributeglobal.asax에서 전역 필터를 제거 하고 customErrors 구성에 전적으로 집중 ResponseRewrite하여 302 HTTP 응답 코드를 피하기 위해 WebForm 리디렉션을 사용하고 redirectmode로 변경했습니다 .

<customErrors mode="On" defaultRedirect="/Error.aspx" redirectMode="ResponseRewrite">
  <error statusCode="404" redirect="/NotFound.aspx" />
</customErrors>

그런 다음 NotFound.aspxpage_load 이벤트 Response.StatusCode에서을 404로 설정하고 Error.aspx에서 코드 500을 설정하십시오.

결과 :

두 가지 목표는 Elmah 로그, 친숙한 오류 페이지 및 코드 숨김에 한 줄의 코드가있는 상태 코드를 통해 달성되었습니다. 우리는 이전 솔루션처럼 "MVC Way"를하지는 않지만 두 줄의 코드라면 괜찮습니다.


5

MVC, ASP 및 선호하는 로깅 / 예외 처리 프레임 워크가 목표를 아주 잘 처리 할 수 ​​있다고 생각합니다. ELMAH와 Enterprise Library는 모두 사용하기 쉬운 예외 처리 및 로깅 기능을 제공하므로 선호하는.

참고 : 친숙한 오류 페이지를 표시 할 수 없으며 질문에서 제안한 것처럼 HTTP 404 또는 500을 반환하십시오. 친숙한 오류 페이지를 반환하면 브라우저에 반환 된 HTTP 코드는 302입니다.이 오류는 친숙한 오류 페이지로 리디렉션됩니다.

친숙한 오류 페이지

한동안 ASP.net에 포함되어있는 '올드 스타일의 web.config 설정으로 목표를 달성 할 수있을 것 같습니다. 개발시 디버그 정보 표시와 프로덕션 환경에서 친숙한 페이지 표시에 대해 언급했습니다. web.config의 사용자 정의 오류 섹션을 사용하여 디버그 정보를 표시하려면 CustomErrors = "Off"를 설정하십시오. 이것을 읽지 않으면 CustomErrors 속성에 익숙하다고 가정합니다.

http://msdn.microsoft.com/en-us/library/h0hfz6fc.aspx

표시하는 오류보기에 대해 더 세밀한 제어가 필요한 경우 MVC의 HandleError 속성을 사용하십시오. 이런 식으로 각 액션 / 컨트롤러에 대해 다른 오류보기를 선택할 수 있습니다.

http://weblogs.asp.net/scottgu/archive/2008/07/14/asp-net-mvc-preview-4-release-part-1.aspx

예외 로깅

모든 예외에 대해 동일한 방식으로 응답하려는 것처럼 들립니다 ( '오류 기록 및 프로덕션 관리자에게 이메일로 보내기'). 이 경우 가장 간단한 옵션은 코드를 추가하는 것입니다.

Application_Error (객체 발신자, EventArgs e)

당신의 global.asax에서. 여기서 선택한 로깅 프레임 워크로 전달할 수 있습니다.

예외 로깅 / 처리에 대한 제어를 강화하려면 HandleErrorAttribute를 서브 클래 싱하고 재정의 할 수 있습니다.

OnException(System.Web.Mvc.ExceptionContext filterContext)

선택한 로깅 프레임 워크로 전달할 수있는 또 다른 곳입니다.

https://stackoverflow.com/questions/183316/asp-net-mvc-handleerror

이것은 위에서 언급 한 Application_Error 기술보다 더 많은 제어를 제공합니다.

일반적으로 MVC는 오류 처리 방법을 세밀하게 제어 할 수 있습니다. 이 컨트롤이 필요하지 않으면 web.config에서 오류 페이지를 정의하는 것과 같은 작업을 수행하는 ASP.net 방식으로 넘어갈 수 있습니다.


의견을 보내 주셔서 감사합니다. 302 상태 코드는 원래 ASP.NET 팀이 디자인을 잘못 선택했다고 생각합니다. 나는 내 대답에서도 그것에 들어갈 것입니다. 그렇게 할 수있는 몇 가지 옵션이 있습니다. MVC 세계의 일부는 customErrors를 완전히 포기하고 응용 프로그램에서 모든 것을 처리하여 재사용 가능성과 제어력을 향상시킵니다. 그러나 나는 그것들을 구현하는 데 한계가 있었으며 더 잘 구워진 것처럼 보이는 많은 코드를 추가하고있었습니다. 아래 답변에 더 자세히 나와 있습니다.

나는 내가이에서 모든 것을, 심지어 오류 발생하는 로그 수있어 이러한 방법으로, 로깅에 대한 OnException 메서드를 재정의하는 것을 선호 Ajax 호출 난 것입니다 찾을 수 없습니다 당신함으로써 Application_Error을 트리거합니다.
Alicia

@Alicia 전체 샘플 코드?
Kiquenet December
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.