Frage

Wir sind mit einem Filestreamresult Videodatum zu einem Silverlight-Media basierten Video-Player zur Verfügung zu stellen:

public ActionResult Preview(Guid id) {
    return new FileStreamResult(
        Services.AssetStore.GetStream(id, ContentType.Preview),
        "application/octet-stream");
}

Leider ist der Silverlight-Video-Player lädt die gesamte Video-Datei, bevor es beginnt zu spielen. Dieses Verhalten wird als unsere Preview Aktion nicht erwartet Teilinhalt unterstützen Download bereit.

(Randnotiz:.., Wenn die Datei in einem virtuellen IIS-Verzeichnis gehostet wird wir die Wiedergabe an einer beliebigen Stelle im Video starten können, während sie noch heruntergeladen wird jedoch für die Sicherheit und Revisions Gründen können wir keinen direkten Download-Link zur Verfügung stellen, so dies ist keine Option.)

Wie können wir die Controller Aktion verbessern Teil HTTP-Content zu unterstützen?

Ich gehe davon aus, müssen wir zunächst den Client informieren, dass wir sie unterstützen (Hinzufügen einer „Accept-Ranges: Bytes“ Header auf eine HEAD-Anfrage), dann müssen wir den HTTP „Range“ Header auswerten und die angeforderte Datei Bereich streamen mit einem Antwortcode von 206. Wird mit ASP.NET MVC, dass die Arbeit auf IIS6 gehostet? Gibt es bereits einige Codes zur Verfügung?

Siehe auch:

War es hilfreich?

Lösung

Es gibt ein Projekt auf CodePlex, die diese genaue Funktionalität gibt.

http://mediastreamingmvc.codeplex.com/

Werfen Sie einen Blick. Es wurde speziell für dieses Szenario erstellt, in dem Sie eine Aktion darstellt, eine Anforderung für eine virtuelle Ressource haben wollen und Teilinhalt zurück, wenn so, ohne dass der Entwickler gebeten viel zu tun, um es zu unterstützen (eine Aktion Filter und Auswahl der Ergebnistypen.)

Andere Tipps

  1. Sie müssen dies selbst implementieren. Und ja, das wird auf IIS6 arbeiten.
  2. Wenn Sie IIS7 verwenden, können Sie wahrscheinlich besser zu nutzen, auf IIS7 Erweiterbarkeit ( Beispiel ).

Dann müssen Sie Drosselung Modul neu zu implementieren:)

Die Idee ist, Bitrate des Videostroms zu berechnen und dann so viel wie erforderlich ist, um Client zu senden. Sie müssen also (sehr kurz) einen Block aus dem Stream lesen und es an den Client und Schlaf für eine Sekunde zu senden.

Thread.Sleep (1000) ist nicht wirklich eine gute Idee für IIS Ressourcen Handhabung, so dass Sie Sachen in asynchroner Weise müssen tun. IAsyncResult wird dein Freund sein.

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

Und das letzte, was ... Ich habe es als einfacher Httphandler arbeitet, nicht als MVC Action. Wenn es in Ihrem Webiste möglich ist, ich empfehle es als Handler zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top