Beim Versuch, ein Objekt in einer Aktion in einem Controller sporadisch scheint es Null zu sein. Ich entdeckte, dass es aufgrund der ReadAsStringAsync()
in der SendAsync()
Override der DelegatingHandler
ist. Das Problem ist mit dem Inhalt. Wenn mein Client einen Inhaltskörper sendet und dieser im Logger gelesen wird, wird er niemals vom Controller Action Invoker gelesen (oder er befindet sich irgendwo in der JsonFormatter
). Ich vermute, dass der nachfolgende Aufruf an Content.ReadAsStringAsync()
eine Ausnahme nicht auslöst, aber auch nicht den erwarteten Inhaltskörper zurückgibt (einige Informationen werden zurückgegeben, die besagen, dass der Async-Lesevorgang abgeschlossen ist).HttpRequestMessage.Content ist verloren, wenn es in einer Protokollierung gelesen wird DelegatingHandler in ASP.NET-Web-API
Aber mein Problem bleibt, da ich einen [FromBody]
Parameter in einer Aktion lesen möchte und es null ist, wenn die RaceCondition Content.ReadStringAsync
durch die gewonnen wird. Wenn JsonFormatter
es zwar gewinnt, bekomme ich das Objekt aber das ist selten (nur beim Dienststart).
Hier ist mein DelegatingHandler
Code:
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;
});
}
}
Hat jemand einen Hinweis auf die Lösung dieses Problems haben?
Vergessen zu erwähnen, das ist RC. Ich vermute, die Beobachtung bleibt in RTM auch gleich – Sando