HttpClient und PushStreamContent

Ich verwende PushStreamContent mit meiner REST-API (ASP.NET Web API) und funktioniert hervorragend. Der HTTP-Client kann eine Ressource anfordern und erhält die HTTP-Antwort, bevor die vollständige Anforderung vom Server verarbeitet wird (der Server schreibt weiterhin in den Push-Stream).

Als HttpClient müssen Sie eine Kleinigkeit tun: Verwenden Sie HttpCompletionOption.ResponseHeadersRead.

Nun meine Frage: Ist es möglich, dies andersherum zu tun? Vom HttpClient -> Daten über einen Push-Stream auf die Web-API hochladen?

Ich habe es wie folgt implementiert, aber die Web-API erhält die Anforderung nicht, bevor der Client den Stream schließt.

         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();

Der AsyncStream ist meine Klasse mit dem Delegierten:

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

Dies ist für den Push-Stream erforderlich.

Ist das irgendwie möglich Der HTTP-Client sendet die Anforderung erst an die Web-API, wenn die letzten Bytes in den Stream geschrieben wurden.

Was muss ich tun? Liegt das Problem auf der Client-Seite oder möglicherweise auf der Server- / Asp.net-Web-API-Seite?

Bearbeiten: Dies ist die Implementierung von WriteToStream (ich verwende jedoch keine Datei von der Festplatte, sondern einen Memorystream 'myMemoryStream' (im Konstruktor übergeben):

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();
    }
}

Vielleicht muss ich etwas tun mit: HttpContent-Inhalt, TransportContext-Kontext?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage