Como transmitir conteúdo parcial com o ASP.NET MVC FileStreamResult

10

Estamos usando um FileStreamResult para fornecer dados de vídeo a um player de vídeo baseado no Silverlight MediaElement:

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

Infelizmente, o player de vídeo do Silverlight faz o download do arquivo de vídeo inteiro antes de começar a ser reproduzido. Esse comportamento é esperado, pois nossa Preview Action não suporta o download de conteúdo parcial.

(observação: se o arquivo estiver hospedado em um diretório virtual do IIS, poderemos iniciar a reprodução em qualquer local do vídeo enquanto ele ainda estiver baixando. No entanto, por razões de segurança e auditoria, não podemos fornecer um link de download direto. isso não é uma opção.)

Como podemos melhorar a ação do controlador para suportar conteúdo HTTP parcial?

Suponho que primeiro temos que informar ao cliente que o suportamos (adicionando um cabeçalho "Accept-Ranges: bytes" a um pedido HEAD), então temos que avaliar o cabeçalho HTTP "Range" e transmitir o intervalo de arquivos solicitado com um código de resposta de 206. Isso funcionará com o ASP.NET MVC hospedado no IIS6? Já existe algum código disponível?

Veja também:

por o_o 21.07.2009 в 10:50
fonte

3 respostas

5

Existe um projeto no CodePlex que fornece essa funcionalidade exata.

link

Dê uma olhada. Ele foi criado especificamente para esse cenário em que você deseja ter uma ação representando uma solicitação para um recurso virtual e retornar conteúdo parcial, se solicitado, sem exigir que o desenvolvedor faça muito para suportá-lo (um filtro de ação e uma opção de tipos de resultados). / p>     

por Erik Noren 17.11.2010 / 00:20
fonte
0
  1. Você precisa implementar isso sozinho. E sim, isso funcionará no IIS6.
  2. Se você puder usar o IIS7, provavelmente é melhor aproveitar a extensibilidade do IIS7 ( exemplo ).
por Mike Chaliy 21.07.2009 / 11:04
fonte
-1

Então você precisa reimplementar o módulo de limitação:)

A ideia é calcular a taxa de bits do fluxo de vídeo e enviar o quanto for necessário para o cliente. Então você precisa (muito brevemente) ler um bloco do seu stream e enviá-lo para o cliente e dormir por um segundo.

Thread.Sleep (1000) não é realmente uma boa idéia para manipular recursos do IIS, então você precisa fazer coisas de maneira assíncrona. IAsyncResult será seu amigo.

Há muito espaço para todos os tipos de otimizações.

E a última coisa ... Eu fiz isso funcionar como httphandler simples, não como MVC ActionResult. Se for possível em seu site, estou recomendando fazer isso como um manipulador.

    
por tomo 21.07.2009 / 13:03
fonte