Domanda

Stiamo usando un FileStreamResult di fornire i dati video ad un video player basato Silverlight MediaElement:

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

Purtroppo, il lettore video Silverlight scarica l'intero file video prima che cominci a giocare. Questo comportamento è previsto come il nostro Preview azione non supporta il download di contenuto parziale.

(nota a margine:.. Se il file è ospitato in una directory virtuale di IIS possiamo iniziare la riproduzione in qualsiasi posizione nel video mentre è ancora scaricando però per motivi di sicurezza e di controllo, non siamo in grado di fornire un link diretto per il download in modo questo non è un'opzione.)

Come si può migliorare l'azione di controllo per supportare contenuti HTTP parziale?

I assumere dobbiamo prima di informare il cliente che sosteniamo esso (l'aggiunta di un "Accept-Ranges: byte" intestazione per una richiesta HEAD), quindi dobbiamo valutare l'HTTP "Range" intestazione e trasmettere la gamma di file richiesto con un codice di risposta di 206. Sarà che il lavoro con ASP.NET MVC ospitato su IIS6? C'è già un certo codice disponibili?

Si veda anche:

È stato utile?

Soluzione

C'è un progetto su CodePlex che dà questa funzionalità esatto.

http://mediastreamingmvc.codeplex.com/

Date un'occhiata. E 'stato creato appositamente per questo scenario in cui si desidera avere un'azione che rappresenta una richiesta di una risorsa virtuale e ritornare contenuto parziale, se richiesto, senza richiedere allo sviluppatore di fare molto per sostenerlo (di un filtro d'azione e la scelta dei tipi di risultati.)

Altri suggerimenti

  1. È necessario implementare questo da soli. E sì, questo funziona su IIS6.
  2. Se è possibile utilizzare IIS7 probabilmente meglio di sfruttare su IIS7 estensibilità ( esempio ).

Quindi è necessario reimplementare modulo throttling:)

L'idea è quella di calcolare il bitrate del flusso video e quindi inviare quanto richiesto per cliente. Quindi è necessario (molto brevemente) per leggere un blocco dal flusso e inviarlo al cliente e dormire per un secondo.

Thread.Sleep (1000) non è davvero una buona idea per la gestione delle risorse di IIS, quindi è necessario fare cose in maniera asincrona. IAsyncResult sarà il vostro amico.

C'è molto spazio per tutti i tipi di ottimizzazioni.

E l'ultima cosa ... ho fatta lavorare come HttpHandler semplice, non come MVC ActionResult. Se è possibile, nel vostro webiste, sto raccomandando di farlo come un gestore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top