2009-07-21 14 views
9

Estamos utilizando un FileStreamResult para proporcionar datos de vídeo a un reproductor de vídeo basado en Silverlight MediaElement:Cómo transmitir contenido parcial con ASP.NET MVC FileStreamResult

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

Por desgracia, el reproductor de vídeo Silverlight descarga el archivo de vídeo antes de que comience a jugar. Se espera este comportamiento ya que nuestra acción Preview no admite la descarga de contenido parcial.

(nota al margen: si el archivo está alojado en un directorio virtual de IIS podemos iniciar la reproducción en cualquier ubicación del video mientras se está descargando. Sin embargo, por razones de seguridad y auditoría no podemos proporcionar un enlace de descarga directa. entonces esto no es una opción.)

¿Cómo podemos mejorar la acción del controlador para soportar contenido HTTP parcial?

Supongo que primero tenemos que informar al cliente que lo apoyamos (agregando un encabezado "Aceptar rangos: bytes" a una solicitud HEAD), entonces tenemos que evaluar el encabezado HTTP "Rango" y transmitir el solicitado rango de archivos con un código de respuesta de 206. ¿Funcionará eso con ASP.NET MVC hospedado en IIS6? ¿Ya hay algún código disponible?

Véase también:

Respuesta

4

Hay un proyecto en CodePlex que proporciona esta funcionalidad exacta.

http://mediastreamingmvc.codeplex.com/

echar un vistazo. Se creó específicamente para este escenario en el que desea tener una acción que represente una solicitud de recurso virtual y devolver contenido parcial si así lo solicita sin requerir que el desarrollador haga mucho para respaldarlo (un filtro de acción y elección de tipos de resultados).

0
  1. Hay que poner en práctica esto por sí mismo. Y sí, esto funcionará en IIS6.
  2. Si puede usar IIS7, probablemente sea mejor utilizar la capacidad de extensión de IIS7 (example).
-1

Luego hay que volver a implementar el módulo de estrangulación :)

La idea es calcular la tasa de bits de la secuencia de vídeo y luego enviar tanto como sea necesario para el cliente. Entonces, necesitas (muy brevemente) leer un bloque de tu transmisión y enviarlo al cliente y dormir por un segundo.

Thread.Sleep (1000) no es realmente una buena idea para manejar los recursos de IIS, por lo que debe hacer las cosas de manera asincrónica. IAsyncResult será tu amigo.

Hay mucho espacio para todo tipo de optimizaciones.

Y lo último ... lo hice funcionar como simple httphandler, no como MVC ActionResult. Si es posible en su sitio web, recomiendo hacerlo como controlador.

Cuestiones relacionadas