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?