Quando si tenta di eseguire un oggetto in un'azione in un controller, sembra sporadicamente nullo. Ho scoperto che è dovuto allo ReadAsStringAsync()
nell'override SendAsync()
dello DelegatingHandler
. Il problema è con il contenuto. Quando il mio cliente invia un corpo del contenuto e viene letto nel logger, non viene mai letto dal Controller Action Invoker (o potrebbe trovarsi da qualche parte nello JsonFormatter
). Sospetto che la successiva chiamata a Content.ReadAsStringAsync()
non generi un'eccezione ma non restituisca il corpo del contenuto previsto (vengono restituite alcune informazioni che indicano che la lettura asincrona è stata completata).HttpRequestMessage.Content viene perso quando viene letto in una registrazione DelegatingHandler in API Web ASP.Net
Ma il mio problema rimane in quanto voglio leggere un parametro [FromBody]
in un'azione ed è null quando il race condition di Content.ReadStringAsync
è vinta dalla DelegatingHandler
. Quando lo vince lo JsonFormatter
, ottengo l'oggetto ma è raro (solo all'avvio del servizio).
Ecco il mio codice 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;
});
}
}
Qualcuno ha un indizio per la soluzione di questo problema?
Dimenticato di parlare di questo è RC. Sospetto che l'osservazione rimanga la stessa anche in RTM – Sando