Al tratar de un objeto en una acción en un controlador esporádicamente parece ser nulo. Descubrí que se debe al ReadAsStringAsync()
en la anulación SendAsync()
del DelegatingHandler
. El problema es con el contenido. Cuando mi cliente envía un cuerpo de contenido y se lee en el registrador nunca es leído por Controller Action Invoker (o puede estar en algún lugar en el JsonFormatter
). Sospecho que la llamada subsiguiente al Content.ReadAsStringAsync()
no arroja una excepción pero tampoco devuelve el cuerpo de contenido esperado (se devuelve cierta información que indica que la lectura asíncrona se ha completado).HttpRequestMessage.Content se pierde cuando se lee en un registro DelegatingHandler en ASP.Net Web API
Pero mi problema persiste ya que quiero leer un parámetro [FromBody]
en una acción y es nulo cuando la RaceCondition de Content.ReadStringAsync
se gana por el DelegatingHandler
. Sin embargo, cuando JsonFormatter
lo gana, obtengo el objeto, pero eso es raro (solo al inicio del servicio).
Aquí es mi DelegatingHandler
código:
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;
});
}
}
¿Alguien tiene una pista para la solución de este problema?
Olvidé mencionar que este es RC. Sospecho que la observación permanece igual en RTM también – Sando