¿TcpClient o HttpWebRequest a Apple TV terminando después de 30 segundos?

Estoy trabajando en la creación de una Biblioteca en C # para usar el protocolo Airplay para enviar fotos y videos a mi Apple TV (específicamente trabajando con la Generación 3, pero espero que eso no importe para esto).

https://airlib.codeplex.com/

Todos los comandos para Airplay son HTTP en el puerto 70 según esta especificación:http://nto.github.com/AirPlay.html

He tenido éxito en conseguir que tanto las fotos como el video se reproduzcan en el Apple TV, pero no importa lo que haga, el AppleTV solo reproducirá 30 segundos de video. Parece que mi cliente C # que emite el comando de reproducción se está desconectando justo a los 30 segundos, lo que hace que el AppleTV finalice la sesión de reproducción.

Razones por las que pienso esto:

Terminar la aplicación cliente produce completamente el mismo comportamiento que esperar 30 segundos (esencialmente forzando el cierre de la conexión).El cierre manual de la conexión HttpWebRequest o TcpClient produce el mismo comportamiento (Midway a través de una sesión de juego).Independientemente del tiempo que permanezco en el punto de interrupción para evitar que GetResponse () llame al video, siempre se agota 30 segundos después de que WebRequest comience a enviar el mensaje.El uso de una fuente diferente (IIS, servidor web externo) para el video no cambia el comportamiento.Incluso después de que el video se haya almacenado en caché en el AppleTV y no se haya vuelto a transmitir, el tiempo de espera aún se produce.

Estoy bastante seguro de que la solicitud del cliente debe mantenerse conectada durante la "reproducción" del video, y que yo sepa, lo he codificado para hacerlo. Realmente estoy en mi ingenio final. He intentado todo lo que se me ocurre incluyendo la solicitud tanto como HttpWebRequest como TcpClient (que funcionan pero expiran), configurando los tiempos de espera de Recibo / Envío a números locos y repitiendo la lectura de la secuencia de Tcp Para asegurarse de que hay "actividad".

Es como si AppleTV esperaba que enviara un mensaje de "hey, seguir jugando", pero todavía no he visto nada de eso de ninguna fuente en la web. Espero que esto sea simplemente algo estúpido que no estoy haciendo debido a mi falta de conocimiento de Http / Tcp.

Aquí está mi 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: utilizando telnet puedo conectarme a AppleTV en el puerto 7000 y pegar este comando que reproduce todo el video:

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

Estoy ejecutando el servidor web Cassini en el puerto 82, pero esto también funciona con IIS. Esto ofrece evidencia adicional de que la pila .Net está haciendo algo bajo el capó a los 30 segundos que causa una desconexión.

Respuestas a la pregunta(1)

Su respuesta a la pregunta