2014-11-27 3 views
3

У меня есть реализация DelegatingHandler для регистрации содержания запроса/ответа:Web API содержание запроса пустой

public class RequestAndResponseLoggerDelegatingHandler : DelegatingHandler 
{ 
    public IDataAccess Data { get; set; } 

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     var started = DateTime.UtcNow; 
     var response = await base.SendAsync(request, cancellationToken); 
     await Log(started, request, response); 
     return response; 
    } 

    private async Task Log(DateTime start, HttpRequestMessage request, HttpResponseMessage response) 
    { 
     var finished = DateTime.UtcNow; 
     var requestContent = await request.Content.ReadAsStringAsync(); 
     var responseContent = await response.Content.ReadAsStringAsync(); 
     var info = new ApiLogEntry(start, finished, requestContent, responseContent, request, response); 
     Data.Log(info); 
    } 
} 

, но по какой-то причине requestContent приходит с пустыми руками. request.Content.Length подтверждает, что есть контент, его просто не извлекают.

Любые идеи?

ответ

7

Поток тела запроса считывается и привязывается к параметрам, и в результате привязки поток помещается в конец. Вот почему он становится пустым. Если вы хотите начать до request.Content.ReadAsStringAsync(), он должен работать. Вместо этого вы можете просто прочитать тело запроса прежде, чем связывание произойдет, что-то вроде этого.

public class RequestAndResponseLoggerDelegatingHandler : DelegatingHandler 
{ 
    public IDataAccess Data { get; set; } 

    protected override async Task<HttpResponseMessage> SendAsync(
          HttpRequestMessage request, 
           CancellationToken cancellationToken) 
    { 
     var started = DateTime.UtcNow; 
     var requestContent = await request.Content.ReadAsStringAsync(); 

     var response = await base.SendAsync(request, cancellationToken); 

     var responseContent = await response.Content.ReadAsStringAsync(); 
     await Log(started, request, response, requestContent, responseContent); 
     return response; 
    } 

    private async Task Log(DateTime start, HttpRequestMessage request, 
          HttpResponseMessage response, string requestContent, 
           string responseContent) 
    { 
     var finished = DateTime.UtcNow;   
     var info = new ApiLogEntry(start, finished, requestContent, responseContent, 
             request, response); 
     Data.Log(info); 
    } 
} 
+0

Работы очарование, большое спасибо. –

+0

Но после этого привязка всегда возвращает нулевой объект, потому что поток уже был прочитан до конца. Как сбросить поток запроса до начала? –

Смежные вопросы