2014-12-03 13 views
5

Do celów rejestrowania próbuję monitorować żądania realizowane za pomocą interfejsu WebAPI. Stworzyłem i szukam sposobu na odzyskanie ciała wysłanego w żądaniu po spełnieniu żądania i udzieleniu odpowiedzi. Próbuję to zrobić za pomocą ActionFilter, ale do tej pory nie udało się odczytać treści z żądania.Powrót Ciało żądania w ramach ActionFilter

Czy ktoś może doradzić, w jaki sposób mogę uzyskać dostęp do tych informacji?

Dla kontekście staram się robić to w ramach tego kodu:

public class LoggingActionFilter : ActionFilterAttribute 
    { 
     public override Task OnActionExecutedAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken) 
     { 
      var test = actionExecutedContext.Request.Content.ReadAsStringAsync().Result; 

      return base.OnActionExecutedAsync(actionExecutedContext, cancellationToken); 
     } 
    } 

próbowałem czytania z powrotem Content o zmiennej actionExecutedContext aby odzyskać ciało, ale znalazłem ten powrót tylko puste tak daleko.

Odpowiedz

4

jesteś po prostu do czynienia z życzeniem ciała, więc nie trzeba używać OnActionExecutedAsync metodę, można po prostu zastąpić OnActionExecuting takiego,

public override void OnActionExecuting(HttpActionContext actionContext) 

    { 
     var test = (actionContext.Request.Content as ObjectContent).Value.ToString(); 
     // your logging code here 
    } 

Inna opcja dostępna w WebAPI jest DelegatingHandler. jeśli chcesz logować tylko zwrócić ciało następnie zastąpić SendAsync metody

public class ApiLogHandler : DelegatingHandler 
{ 
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,   
               CancellationToken cancellationToken) 
{ 
    var requestBody = request.Content.ReadAsStringAsync().Result; 
    // your logging code here 
    return base.SendAsync(request, cancellationToken); 
} 
} 

Jeśli zdecydowałeś się wybrać DelegatingHandler następnie trzeba zarejestrować ten moduł obsługi do Global message handlers.

+1

Próbowałem już polecenia OnActionExecuting, ale bez powodzenia, generuje błąd "Obiekt nie odwołuje się do instancji obiektu". Pomysł z obsługą delegującą działa, ale miałem nadzieję, że zrobię to po spełnieniu żądania. Czy to byłoby możliwe? –

+0

Po zmianie funkcji na użycie funkcji innej niż asynchroniczna, zgodnie z sugestią, udało mi się odzyskać ciało tak, jak chciałem, za pomocą 'actionExecutedContext.Request.Content.ReadAsStringAsync(). Dzięki! –

Powiązane problemy