При попытке объекта в Action в контроллере он спорадически кажется нулевым. Я обнаружил, что это связано с ReadAsStringAsync() в SendAsync() переопределении DelegatingHandler. Проблема заключается в содержании. Когда мой клиент отправляет тело контента и он читается в журнале, он никогда не читается Invoker контроллера (или может быть где-то в JsonFormatter). Я подозреваю, что последующий вызов Content.ReadAsStringAsync() не генерирует исключение, но также не возвращает ожидаемое тело содержимого (возвращается некоторая информация, указывающая, что чтение асинхронного текста завершено).
Но моя проблема остается, так как я хочу прочитать параметр [FromBody] в действии, и он равен нулю, когда RaceCondition Content.ReadStringAsync выигрывает DelegatingHandler. Однако, когда JsonFormatter выигрывает, я получаю объект, но это редко (только при запуске службы).
Вот мой код DelegatingHandler:
public class LogHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var apiRequest = new WebApiUsageRequest(request);
WriteLog(apiRequest);
request.Content.ReadAsStringAsync().ContinueWith(t =>
{
apiRequest.Content = t.Result;
WriteLog(apiRequest);
});
return base.SendAsync(request, cancellationToken).ContinueWith(task =>
{
var apiResponse = new WebApiUsageResponse(task.Result);
apiResponse.Content = task.Result.Content != null ? task.Result.Content.ReadAsStringAsync().Result : null;
WriteLog(apiResponse);
return task.Result;
});
}
}
У кого-нибудь есть ключ к решению этой проблемы?