2013-03-31 3 views
2

THIS 다음에 MVC 4 응용 프로그램에 대한 오류 처리기를 구현하고 있습니다.
이제 모든 오류에 대해 거의 동일한 작업을 수행하고 있습니다. 404뿐만 아니라 디버깅 모드에서 전체 스택 추적, 작은 디스플레이 등과 같은 유용한 정보가 포함되어 있으므로 로깅을 위해 저장하거나 원래의 응답을 저장하고 싶습니다. 코드에서 오류가 발생했습니다.MVC 응답 내용 얻기

이제 Response 개체에서 버퍼링 된 repsonse 데이터를 가져 오는 것과 관련하여 어려움을 겪고 있지만 Response.Clear()을 호출하는 방법은 알 수 없습니다.

어떻게 HttpResonse 개체의 콘텐츠를 가져올 수 있습니까? 대한

HttpWebResponseHttpResonse 및 읽을 수없는 OutputStream에 대한 GetResponseStream() 내가 예를 많이 볼 경우, 그 사용할 수 있습니다 방법, 아무것도하지만 ... 만약

답변

1

확실하지가 이 올바른 방향으로 도움이 될 수 있지만, 난 그냥이 사용

[AttributeUsage(AttributeTargets.Class)] 
public class ErrorHandlerAttribute : FilterAttribute, IExceptionFilter 
{ 

    readonly BaseController _bs = new BaseController(); 

    public virtual void OnException(ExceptionContext fc) 
    { 
     var model = new errors 
     { 
      stacktrace = fc.Exception.StackTrace, 
      url = fc.HttpContext.Request.RawUrl, 
      controller = fc.RouteData.GetRequiredString("controller"), 
      source = fc.Exception.Source, 
      errordate = DateTime.Now, 
      message = fc.Exception.Message//, 
      //InnExc = String.IsNullOrEmpty(fc.Exception.InnerException.ToString()) ? fc.Exception.InnerException.ToString() : "" 
     }; 

     var message = "<html><head></head><body><h2>An error occured on " + _bs.GetKeyValue<string>("Mobile Chat App") + ".</h2>"; 
     message += "<strong>Message:</strong> <pre style=\"background-color:#FFFFEF\"> " + model.message + "</pre><br />"; 
     message += "<strong>Source:</strong> <pre style=\"background-color:#FFFFEF\">" + model.source + "</pre><br />"; 
     message += "<strong>Stacktrace:</strong><pre style=\"background-color:#FFFFEF\"> " + model.stacktrace + "</pre><br />"; 
     message += "<strong>Raw URL:</strong> <pre style=\"background-color:#FFFFEF\">" + model.url + "</pre></br />"; 
     message += "<strong>Inner Exception:</strong> <pre style=\"background-color:#FFFFEF\">" + model.InnExc + "</pre></br />"; 
     message += "<strong>Any Form values</strong>: <pre>" + fc.HttpContext.Request.Form + "</pre><br />"; 
     message += "</body></html>"; 

     fc.ExceptionHandled = true; 
     fc.HttpContext.Response.Clear(); 
     fc.HttpContext.Response.StatusCode = 500; 
     fc.HttpContext.Response.TrySkipIisCustomErrors = true; 

     _bs.SendErrorMail(message); 

     fc.ExceptionHandled = true; 
     //var res = new ViewResult { ViewName = "error" }; 
     //fc.Result = res; 
     fc.HttpContext.Response.Redirect("/ErrorPage"); 
     //fc.HttpContext.Response.RedirectToRoute("error",new{controller="Home",action="ErrorPage"}); 
    } 

나는 Gmail은 오류가 난에 모든 오류를 던져, 아무것도 내가 할 사이트와 잘못되면 알려 수 있다는 계정이,이 있습니다 정보로 아직 나를 실망시키지 않았다. 나는 내가 요즘 다른 방법을 사용할 때, 크게와이에 보였지만되지 않은 :

fc.HttpContext.Request.RawUrl, 

그냥 HttpContext를, 당신은 HttpContext를 잡고해야합니까, 내가 가서 fc.HttpContext의 URL을 사용하여 .Request.Form을 사용하면 오류의 원인이 될 수있는 모든 양식 데이터를 가져올 수 있습니다.

이것은 사용자가 요청한 것과 같은 응답이 아니지만 응답이 아닌 요청하는 동안 오류를 잡아 내기 때문입니다! 그런 다음 응답을 지우고 (오류 500) 키보드로 원숭이의 멋진 그림이있는 내 페이지로 리디렉션하여이를 대체합니다.

+0

기본 오류가 준비하는 모든 것이 예외에 포함되지 않습니다. 너는하지만 지금은이 길을 갔다. 아무도 더 나은 답변을 곧 제공하지 않으면 나는 당신의 것을 받아 들일 것입니다 ... – ChrFin

+0

그래,하지만 위의 나는 기본적으로 내 이메일에 YSOD를 줄만큼 많이 사용한다. 정말 다른 것을 위해 try/catch와 함께 사용하고 전자 메일 컴파일러에 예외를 보내서 트릭을 놓칠 수 없도록 배웠습니다. 좋은 팁은 브라우저 유형을 포함하는 것이 었습니다. 이것이 내가 발견 한 버그를 발견하는 데 도움이되었습니다. 블랙 베리 브라우저에만 해당 – davethecoder