2011-02-17 6 views
17

내 global.asax.cs 파일에서 HttpRequestValidationException을 처리하는 코드 조각이 있습니다.프로덕션에서 HttpRequestValidationException을 catch하는 방법

protected void Application_Error(object sender, EventArgs e) 
{ 
    var context = HttpContext.Current; 
    var exception = context.Server.GetLastError(); 
    if (exception is HttpRequestValidationException) 
    { 
     Response.Clear(); 
     Response.StatusCode = 200; 
     Response.Write(@"<html><head></head><body>hello</body></html>"); 
     Response.End(); 
     return; 
    } 
} 

웹 응용 프로그램을 디버깅하면 완벽하게 작동합니다. 하지만 프로덕션 서버에 올려 놓으면 서버가이를 무시하고 잠재적으로 위험한 request.form 값 을 클라이언트에서 발견했습니다 "- 오류 페이지를 생성합니다. 정확히 무슨 일이 일어날 지 모르겠다 ... 누군가가 문제가 무엇인지, 또는 내가 뭘 잘못 알고 있는지 ...

또한 web.config에서 validaterequest를 false로 설정하고 싶지 않습니다.

서버는 IIS7.5를 사용하며 asp.net 3.5를 사용하고 있습니다.

덕분에,

답변

10

확인 브루노, 나는 그것을 내 자신을 발견했다. 마지막 오류를 해결해야합니다. 단지 MVC와 함께 작동

protected void Application_Error(object sender, EventArgs e) 
{ 
    var context = HttpContext.Current; 
    var exception = context.Server.GetLastError(); 
    if (exception is HttpRequestValidationException) 
    { 
     context.Server.ClearError(); // Here is the new line. 
     Response.Clear(); 
     Response.StatusCode = 200; 
     Response.Write(@"<html><head></head><body>hello</body></html>"); 
     Response.End(); 
     return; 
    } 
} 
+2

"컨텍스트"var이 필요하지 않다고 생각합니다. 그것은 "Server.GetLastError()"및 "Server.ClearError()"로 잘 작동합니다. – WildJoe

+0

Response.End()는 의도적으로 예외를 throw합니다. 대신 이것을 사용하십시오 : 'HttpContext.Current.ApplicationInstance.CompleteRequest'. 설명을 보려면 다음을 참조하십시오. https://support.microsoft.com/en-us/help/312629/prb-threadabortexception-occurs-if-you-use-response-end-response-redir – Kamran

4

또 다른 방법은 사용자 정의 예외 필터 사용 :

  • 는 FilterAttribute 내부에서 IExceptionFilter
  • 를 구현하는 사용자 지정 FilterAttribute 만들기를, 당신은 컨트롤러 또는보기로 리디렉션 할 수 있습니다 오류를 표시하는 데 사용됩니다.
  • 은 Global.asax에있는 필터를 등록하거나 컨트롤러

이 오류보기를 렌더링하는 일반적인 MVC 인프라 (면도기)를 사용할 수있는 장점이있다 때문이다.

public class HttpRequestValidationExceptionAttribute : FilterAttribute, IExceptionFilter { 

    public void OnException(ExceptionContext filterContext) { 
     if (!filterContext.ExceptionHandled && filterContext.Exception is HttpRequestValidationException) { 
      filterContext.Result = new RedirectResult("~/HttpError/HttpRequestValidationError"); 
      filterContext.ExceptionHandled = true; 
     } 
    } 
} 
+0

감사합니다. 공유하기 :-) 여유 시간이있을 때 살펴 보겠습니다. – bruno

+0

항상 즐거움 :> –

+0

감사합니다. 나는 그것을 사용했지만 filterContext.ExceptionHandled가 이미 true로 설정되어있어 if 문에있는 코드가 실행되지 않고 기본 오류 페이지가 표시된다는 것을 알았습니다. 나는 그 조건을 풀어 냈고 이제는 완벽하게 작동하는 것처럼 보입니다. 그렇게하면 다른 곳에서도 문제가 발생할 수 있는지 확실하지 않습니다 ... 어떤 생각입니까? 감사! – Kate

관련 문제