So streamen Sie partiellen Inhalt mit ASP.NET MVC FileStreamResult

9

Wir verwenden ein FileStreamResult, um Videodaten für einen Silverlight MediaElement-basierten Videoplayer bereitzustellen:

%Vor%

Leider lädt der Silverlight-Videoplayer die gesamte Videodatei herunter, bevor sie abgespielt wird. Dieses Verhalten wird erwartet, da unsere Preview -Aktion das Herunterladen partieller Inhalte nicht unterstützt.

(Hinweis: Wenn die Datei in einem virtuellen IIS-Verzeichnis gehostet wird, können wir die Wiedergabe an einem beliebigen Ort im Video starten, während es noch heruntergeladen wird. Aus Sicherheits- und Überwachungsgründen können wir jedoch keinen direkten Download-Link bereitstellen Dies ist keine Option.)

Wie können wir die Controller-Aktion zur Unterstützung von partiellem HTTP-Inhalt verbessern?

Ich nehme an, wir müssen zuerst den Client informieren, dass wir es unterstützen (Hinzufügen einer "Accept-Ranges: Bytes" Header zu einer HEAD Anfrage), dann müssen wir den HTTP "Range" Header auswerten und den angeforderten Dateibereich streamen mit einem Antwortcode von 206. Funktioniert das mit ASP.NET MVC, das auf IIS6 gehostet wird? Gibt es bereits einen Code?

Siehe auch:

o_o 21.07.2009, 08:50
quelle

3 Antworten

4

Es gibt ein Projekt auf CodePlex, das genau diese Funktionalität bietet.

Ссылка

Sieh es dir an. Es wurde speziell für dieses Szenario erstellt, in dem eine Aktion eine Anforderung für eine virtuelle Ressource darstellen und teilweise Inhalt zurückgeben soll, wenn dies gewünscht wird, ohne dass der Entwickler viel tun muss (ein Aktionsfilter und eine Auswahl von Ergebnistypen) / p>     

Erik Noren 16.11.2010, 23:20
quelle
0
  1. Sie müssen das selbst implementieren. Und ja, das wird auf IIS6 funktionieren.
  2. Wenn Sie IIS7 verwenden können, sollten Sie besser auf die Erweiterbarkeit von IIS7 zurückgreifen ( Beispiel ).
Mike Chaliy 21.07.2009 09:04
quelle
-1

Dann müssen Sie das Drosselungsmodul neu implementieren:)

Die Idee besteht darin, die Bitrate Ihres Videostreams zu berechnen und dann so viel wie nötig an den Client zu senden. Sie müssen also (ganz kurz) einen Block aus Ihrem Stream lesen und ihn für eine Sekunde an den Client senden.

Thread.Sleep (1000) ist nicht wirklich eine gute Idee für die Behandlung von IIS-Ressourcen, so dass Sie Dinge auf asynchrone Weise tun müssen. IAsyncResult wird dein Freund sein.

Es gibt viel Platz für alle Arten von Optimierungen.

Und das letzte ... Ich habe es als einfachen httphandler funktioniert, nicht als MVC ActionResult. Wenn es in Ihrer Website möglich ist, empfehle ich es als Handler zu tun.

    
tomo 21.07.2009 11:03
quelle