Pergunta

Eu estou tentando transmitir QuickTime vídeo para um iPhone a partir de uma aplicação web ASP.NET usando um HttpHandler. Quando hospeda o aplicativo web do IIS 5.1 (Windows XP), o player de vídeo abre e exibe o erro "O servidor não está configurado corretamente. No entanto, quando usando o IIS 7.5 (Windows 7), o vídeo é reproduzido bem.

O ambiente de produção está executando o IIS 6.0 e tem o mesmo problema, onde a tentativa de reproduzir vídeos no iPhone via Mobile Safari exibe o erro acima.

Eu verifiquei a cabeçalhos HTTP e eles parecem ser praticamente a mesma entre os dois servidores (com excepção de alguns, como o Servidor cabeçalho, que será, obviamente, diferente), se não se aparecem em ordem diferente, embora eu duvide que isso está causando o problema.

De acordo com a esta discussão no Google grupos, adicionando os 'Accept-Ranges: bytes' cabeçalho pode ajudar, mas isso não fez diferença para nós. Eu também acrescentou o cabeçalho ETag, sem qualquer sorte.

O código realmente responsável por enviar o arquivo é algo como isto:

Context.Response.Buffer = true;
Context.Response.ContentType = "video/x-m4v";

Context.Response.AppendHeader("Content-Disposition", "filename=\"Video.m4v\"");
Context.Response.AppendHeader("Content-Length", "23456789");

Context.Response.AppendHeader("Accept-Ranges", "bytes");
Context.Response.AppendHeader("ETag", GetETag(path));

Context.Response.TransmitFile(path);

O código acima quais arquivos transmite parece estar funcionando corretamente e arquivos de vídeo reproduzir corretamente em todos os navegadores de desktop e quando hospedagem do IIS 7.5 no Windows 7. O problema é apenas aparente ao tentar reproduzir arquivos de vídeo no iPhone usando o Mobile Safari usando o código acima com a aplicação web ASP.NET sendo hospedado no IIS 5.1 ou IIS 6.0.

Alguém tem mais alguma coisa experiente como este e tenho algumas ideias sobre o que posso fazer para começar este trabalho?

Foi útil?

Solução

Por que você definir Response.Buffer a verdade?

Você não pode simplesmente adicionar o cabeçalho "Accept-Ranges" a menos que você também garantir que o servidor suporta HTTP solicitações de intervalo. Se o jogador cliente exige suporte para solicitações de intervalo eo servidor se recusa a lidar com eles, parece lógico que o pedido seria rejeitado.

Você pode tentar usar Fiddler como um reverse-proxy e ver se o IPhone faz um pedido Range. http://www.fiddler2.com/Fiddler/Help/ReverseProxy.asp

Outras dicas

Depois de algumas pesquisas, me deparei com o artigo os pedidos gama-específicos em ASP.NET que descreve exatamente o problema que eu estava tendo. Implementação do RangeRequestHandlerBase classe a partir deste site (com algumas pequenas modificações para caber dentro de nossa estrutura de projeto existente) parece ter resolvido o problema, e reprodução de vídeo agora opera corretamente a partir IIS5 / 6.

@Eric - Eu upvoted sua resposta como o seu comentário foi uma cutucada na direção certa. Basta adicionar o cabeçalho 'Accept-Ranges' não foi suficiente (apesar de trabalhar no IIS7), eo http manipulador precisava ser modificado para solicitações de intervalo punho e garantir que os dados corretos estão sendo enviados.

Use algo como Fiddler para expor a resposta HTTP exata vindo dos servidores. Fudge seqüência User-Agent do cliente para coincidir com o navegador do iPhone (ou apenas usar o Safari?) E comparar a saída do IIS 5.1 e 7.5. Obviamente, os fluxos de resposta não são idênticos ou ele estaria trabalhando em ambos.

Você também pode usar NetMon, que é uma grande ferramenta ... e permitiria que você teste com o próprio iPhone.

Desculpe eu não tenho uma resposta específica para você, mas eu acho que você vai ter que sujar as mãos com um presente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top