TcpClient ou HttpWebRequest para a Apple TV que termina depois de 30 segundos?

Eu estou trabalhando na criação de uma biblioteca em C # para usar o protocolo Airplay para enviar fotos e vídeo para o meu Apple TV (especificamente trabalhando com a geração 3, mas espero que isso não importa para isso).

https://airlib.codeplex.com/

Todos os comandos para o Airplay são HTTP na porta 70, de acordo com esta especificação:http://nto.github.com/AirPlay.html

Tenho tido sucesso em obter fotos e vídeos para serem reproduzidos na Apple TV, mas não importa o que eu faça, a AppleTV só reproduz 30 segundos de vídeo. Parece que meu cliente C # que emite o comando play está se desconectando em 30 segundos, o que faz com que o AppleTV termine a sessão de reprodução.

Razões pelas quais eu penso isso:

Encerrar o aplicativo cliente produz o mesmo comportamento que esperar 30 segundos (essencialmente forçando o fechamento da conexão).Fechar manualmente a conexão HttpWebRequest ou TcpClient produz o mesmo comportamento (na metade de uma sessão de reprodução).Independentemente de quanto tempo eu mantenho o ponto de interrupção para evitar que o GetResponse () chame o vídeo sempre expira 30 segundos após o WebRequest começar a enviar a mensagem.Usando uma fonte diferente (IIS, servidor externo) para o vídeo não altera o comportamento.Mesmo depois que o vídeo foi armazenado em cache no AppleTV e não é re-stream, o tempo limite ainda ocorre.

Tenho certeza de que a solicitação do cliente precisa ficar conectada durante todo o "play" do vídeo e, até onde sei, codifiquei isso para fazer isso. Eu realmente estou no meu juízo final. Eu tentei tudo o que posso pensar incluindo fazer o pedido, tanto como um HttpWebRequest e como um TcpClient bruto (que ambos funcionam, mas ambos os tempos limite), definindo os tempos limite Recieve / Send para números loucos, e looping a leitura do fluxo Tcp para garantir que haja "atividade".

É como se a AppleTV estivesse esperando que eu enviasse uma mensagem "ei, continue jogando", mas ainda não vi nada parecido em nenhuma fonte na web. Eu estou esperando que isso é simplesmente algo estúpido que eu não estou fazendo com base na minha falta de conhecimento Http / Tcp.

Aqui está o meu código:

    Uri url = "http://somevideo.com/video.mov";
    float startPosition = 0;        
    TcpClient tcpClient = new TcpClient("192.168.1.20",7000);
    tcpClient.ReceiveTimeout = 100000;
    tcpClient.SendTimeout = 100000;

    //get the client stream to read data from.
    NetworkStream clientStream = tcpClient.GetStream();

     string body = 
    "Content-Location: " + url + "\n" +
    "Start-Position: " + startPosition + "\n";

    string request = "POST /play HTTP/1.1\n" + 
    "User-Agent: MediaControl/1.0\n" +
    "Content-Type: text/parameters\n" +
    "Content-Length: " + Encoding.ASCII.GetBytes(body).Length + "\n" +           
    "X-Apple-Session-ID:" + _sessionGuid.ToString() + "\n\n";

    sendMessage(clientStream, request);
    sendMessage(clientStream, body);

    byte[] myReadBuffer = new byte[1024];
    StringBuilder myCompleteMessage = new StringBuilder();
    int numberOfBytesRead = 0;

    //incoming message might be bigger than the buffer
    do
    {
        try
        {
            numberOfBytesRead = clientStream.Read(myReadBuffer, 0, myReadBuffer.Length);
            myCompleteMessage.Append(Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead));
            Thread.Sleep(10);//let the iOS device catch up sending data
        }
        catch (System.IO.IOException) { }
    } while (tcpClient.Connected); //check if it's connected before checking for data available, as maybe the program might get quit and the sockets closed halfway through a read

Nota: usando telnet eu sou capaz de se conectar ao AppleTV na porta 7000 e cole neste comando que reproduz o vídeo inteiro:

POST /play HTTP/1.1
User-Agent: MediaControl/1.0
Content-Type: text/parameters
Content-Length: 89
X-Apple-Session-ID:fb6d816a-a5ad-4e8f-8830-9642b6e6eb35

Content-Location: http://192.168.1.11:82/2012/2012_03_11/IMG_1328.MOV
Start-Position: 0

Estou executando o Cassini Webserver na porta 82, mas isso também funciona com o IIS. Isso oferece mais evidências de que a pilha .Net está fazendo algo sob o capô em 30 segundos que causa uma desconexão.