При попытке объекта в 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;
});
}
}
У кого-нибудь есть ключ к решению этой проблемы?