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?