2014-04-09 6 views
8

전역 적으로 오류를 기록하는 새로운 방법을 사용하고 싶습니다. 나는 ExceptionLogger을 상속받은 클래스를 작성했으며 Log() 메소드를 재정의했다. 그런 다음 대체품으로 등록했습니다.ExceptionLogger에서 작업 매개 변수 참조

public class TraceExceptionLogger : ExceptionLogger 
{ 
    public async override void Log(ExceptionLoggerContext context) 
    { 
     // This is always empty string 
     var content = await context.Request.Content.ReadAsStringAsync(); 

     // This is almost always null 
     var actionContext = context.ExceptionContext.ActionContext; 
    } 
} 

나는 액션 매개 변수를 제외하고 내가 필요한 거의 모든 것을 얻을 수있는 ExceptionLoggerContext 개체의 속성을 통해 발굴 할 수 있습니다. 실제로 ActionContext 속성이 있지만 null 만 보았고 this wiki pageActionContextControllerContext이 거의 항상 null이라는 것을 나타냅니다.

또한 스트림이 내 기록기에 도착하기 전에 이미 스트림이 읽혀 있기 때문에 콘텐츠 스트림을 가져올 수 없습니다. 따라서 요청 된 내용에서 게시 된 json을 가져올 방법이 없습니다.

게시 된 데이터를 HttpContext.Current 또는 다른 방법으로 가져 오는 방법이 있습니까?

답변

7

이 좋아 내가이 같은 요청 객체의 InputStream를 읽어 HttpContext를에서 본문 텍스트를 얻을 수 있습니다 다음과 같습니다

string bodyText = string.Empty; 

using (var sr = new StreamReader(HttpContext.Current.Request.InputStream)) 
{ 
    sr.BaseStream.Seek(0, SeekOrigin.Begin); 
    bodyText = sr.ReadToEnd(); 
} 

이 코드는 성공적이었다 내가 지금까지 내 게시 된 JSON 데이터를 가져 오는.

+1

나중에 참조 할 수 있도록 조치 매개 변수입니다! 나는 곧 죽을려고했다. 요청 내용을 로깅 할 수없는 초조함이었습니다. –

+0

@StefanVasiljevic 나는 그것이 도움이되고 당신의 목숨을 구했다고 기쁘다. 내 코드가 그 일을 처음으로 한 것 같아. 하하. 건배! – jlafay

+1

@jlafay .. 그리고 그것은 마지막이 아닐 것입니다! 2017 년 11 월, 아직도 생명을 구하고 있습니다! – CloudyOne

4

다음은 내 엉덩이 저장된

public class HomeController : ApiController { 
    public string Get(string id, [FromHeader] Whoever whoever) { 

    public string Post(Whatever whatever) { 


var args = ((ApiController) context.ExceptionContext 
      .ControllerContext.Controller)).ActionContext.ActionArguments 

if (args.ContainsKey("whatever")) { 
    var whatever = (Whatever)args["whatever"];