Web Api + HttpClient: un módulo o controlador asíncrono completado mientras aún estaba pendiente una operación asíncrona

Estoy escribiendo una aplicación que procesa algunas solicitudes HTTP utilizando la API web de ASP.NET y me cuesta identificar el origen de un error intermitente. Parece una condición de carrera ... pero no estoy del todo seguro.

Antes de entrar en detalles, aquí está el flujo de comunicación general de la aplicación:

Cliente realiza una solicitud HTTP aProxy 1.Proxy 1 retransmite el contenido de la solicitud HTTP al Proxy 2Proxy 2 retransmite el contenido de la solicitud HTTP a la aplicación web de destinoAplicación web de destino responde a la solicitud HTTP y la respuesta se transmite (transferencia fragmentada) al Proxy 2Proxy 2 devuelve la respuesta aProxy 1 que a su vez responde a la llamada originalCliente.

Las aplicaciones Proxy están escritas en ASP.NET Web API RTM utilizando .NET 4.5. El código para realizar el relevo se ve así:

//Controller entry point.
public HttpResponseMessage Post()
{
    using (var client = new HttpClient())
    {
        var request = BuildRelayHttpRequest(this.Request);

        //HttpCompletionOption.ResponseHeadersRead - so that I can start streaming the response as soon
        //As it begins to filter in.
        var relayResult = client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead).Result;

        var returnMessage = BuildResponse(relayResult);
        return returnMessage;
    }
}

private static HttpRequestMessage BuildRelayHttpRequest(HttpRequestMessage incomingRequest)
{
    var requestUri = BuildRequestUri();
    var relayRequest = new HttpRequestMessage(incomingRequest.Method, requestUri);
    if (incomingRequest.Method != HttpMethod.Get && incomingRequest.Content != null)
    {
       relayRequest.Content = incomingRequest.Content;
    }

    //Copies all safe HTTP headers (mainly content) to the relay request
    CopyHeaders(relayRequest, incomingRequest);
    return relayRequest;
}

private static HttpRequestMessage BuildResponse(HttpResponseMessage responseMessage)
{
    var returnMessage = Request.CreateResponse(responseMessage.StatusCode);
    returnMessage.ReasonPhrase = responseMessage.ReasonPhrase;
    returnMessage.Content = CopyContentStream(responseMessage);

    //Copies all safe HTTP headers (mainly content) to the response
    CopyHeaders(returnMessage, responseMessage);
}

private static PushStreamContent CopyContentStream(HttpResponseMessage sourceContent)
{
    var content = new PushStreamContent(async (stream, context, transport) =>
            await sourceContent.Content.ReadAsStreamAsync()
                            .ContinueWith(t1 => t1.Result.CopyToAsync(stream)
                                .ContinueWith(t2 => stream.Dispose())));
    return content;
}

El error que se produce de forma intermitente es:

Se completó un módulo o controlador asíncrono mientras aún estaba pendiente una operación asíncrona.

Este error generalmente ocurre en las primeras solicitudes a las aplicaciones proxy después de las cuales el error no se vuelve a ver.

Visual Studio nunca atrapa la excepción cuando se lanza. Pero el error puede detectarse en el evento Global.asax Application_Error. Lamentablemente, la excepción no tiene ningún seguimiento de pila.

Las aplicaciones proxy están alojadas en los roles web de Azure.

Cualquier ayuda que identifique al culpable sería apreciada.

Respuestas a la pregunta(3)

Su respuesta a la pregunta