HttpClient e PushStreamContent

Eu uso o PushStreamContent com minha API REST (ASP.NET Web API) e funciona muito bem. O HttpClient pode solicitar um recurso e obtém a resposta HTTP antes que a solicitação completa seja tratada pelo servidor (o servidor ainda grava no fluxo de envio).

Como HttpClient, você precisa fazer uma pequena coisa: Use HttpCompletionOption.ResponseHeadersRead.

Agora minha pergunta: é possível fazer isso de outra maneira? Do HttpClient -> upload de dados via push-stream para a API da Web?

Eu o implementei como abaixo, mas a API da Web recebe a solicitação antes que o cliente feche o fluxo.

         var asyncStream = new AsyncStream(fs);
         PushStreamContent streamContent = new PushStreamContent(asyncStream.WriteToStream);
         content.Add(streamContent);

         HttpResponseMessage response = await c.SendAsync(new HttpRequestMessage(new HttpMethod("POST"), "http://localhost/...") { Content = content }, HttpCompletionOption.ResponseHeadersRead);

         response.EnsureSuccessStatusCode();

O AsyncStream é minha classe com o delegado:

public async void WriteToStream(Stream outputStream, HttpContent content, TransportContext context)

Isso é necessário para o Push-Stream.

Isso é possível de alguma forma? O HttpClient não envia a solicitação para a API da Web até que os últimos bytes sejam gravados no fluxo ...

O que eu tenho que fazer? O problema está no lado do cliente ou talvez na API do servidor / asp.net?

Edit: Esta é a implementação de WriteToStream (mas eu não uso um arquivo do disco, é usar um fluxo de memória 'myMemoryStream' (transmitido no construtor):

public void WriteToStream(Stream outputStream, HttpContent content, TransportContext context)
{
    try
    {
        var buffer = new byte[4096];

        using (var stream = myMemoryStream)
        {
            var bytesRead = 1;

            while (bytesRead > 0)
            {
                bytesRead = video.Read(buffer, 0, buffer.Length);
                outputStream.Write(buffer, 0, bytesRead);
            }
        }
    }
    catch (HttpException ex)
    {
        return;
    }
    finally
    {
        outputStream.Close();
    }
}

Talvez eu tenha que fazer algo com: conteúdo HttpContent, contexto TransportContext?

questionAnswers(2)

yourAnswerToTheQuestion