2014-12-03 13 views
5

Günlüğe kaydetme amacıyla, WebAPI aracılığıyla yapılan istekleri izlemeye çalışıyorum. Ben yarattım ve istek yerine getirildikten ve yanıt verildikten sonra bir talepte gönderilen bedeni geri almak için bir yol arıyorum. Bunu bir ActionFilter kullanarak yapmaya çalışıyorum, ancak şu ana kadar istekte bulunan gövdeyi okumada başarısız oldum.Geri Döndürme Gövdesini ActionFilter İçerisinde

Bu bilgilere nasıl erişebileceğimi bilenler için herhangi bir tavsiyede bulunabilir mi? Cesedi geri almak için actionExecutedContext değişkeni Content geri okuma denedi ama yani sadece boş dönmek için bu bulduk

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

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

: içerik için

bu kodun içinde yapmanız çalışıyorum uzak. Sadece istek gövdesinin uğraşıyoruz

cevap

4

böylece WebAPI mevcut

public override void OnActionExecuting(HttpActionContext actionContext) 

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

Başka bir seçenek DelegatingHandler ise, sadece böyle OnActionExecuting geçersiz kılabilir, OnActionExecutedAsync yöntemi kullanmak gerekmez. Eğer oturum açmak isterseniz DelegatingHandler o zaman Global message handlers bu işleyici kaydetmeniz gerekir seçmeye karar, sadece,

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); 
} 
} 

vücut sonra SendAsync yöntemini geçersiz talep ediyoruz.

+1

OnActionExecuting komutunu denedim ancak şansım olmadı, bir 'nesne başvurusu bir nesnenin örneğine ayarlanmadı' hatası atar. Temsilci işleyicisiyle yapılan fikir işe yarıyor ama istek yerine getirildikten sonra bunu yapmayı umuyordum. Bu mümkün mü? –

+0

Benim önerdiğim gibi bir Async işlevini kullanarak işlevimi değiştirdikten sonra, actionExecutedContext.Request.Content.ReadAsStringAsync(). Sonuç ile istediğim şekilde vücuda geri dönebildim. Teşekkürler! –

İlgili konular