TcpClient lub HttpWebRequest do Apple TV kończy się po 30 sekundach?

Pracuję nad stworzeniem Biblioteki w C #, aby użyć protokołu Airplay do wysyłania Zdjęć i Wideo do mojego Apple TV (Specjalnie z Generacją 3, ale mam nadzieję, że nie powinno to mieć znaczenia).

https://airlib.codeplex.com/

Wszystkie polecenia Airplay są HTTP na porcie 70 zgodnie z tą specyfikacją:http://nto.github.com/AirPlay.html

Udało mi się odtwarzać zarówno zdjęcia, jak i filmy w Apple TV, ale niezależnie od tego, co robię, AppleTV będzie odtwarzać tylko 30 sekund wideo. Wygląda na to, że mój klient C #, który wydaje polecenie odtwarzania, rozłącza się po 30 sekundach, co powoduje, że AppleTV kończy sesję odtwarzania.

Powody, dla których tak sądzę:

Zakończenie aplikacji klienckiej powoduje takie samo zachowanie, jak oczekiwanie 30 sekund (zasadniczo wymuszenie zamknięcia połączenia).Ręczne zamknięcie połączenia HttpWebRequest lub TcpClient powoduje takie samo zachowanie (Midway poprzez sesję odtwarzania).Niezależnie od tego, jak długo utrzymuję punkt przerwania, aby uniemożliwić wywołanie GetResponse (), wideo zawsze wygasa 30 sekund po rozpoczęciu wysyłania wiadomości przez WebRequest.Użycie innego źródła (IIS, zewnętrzny serwer WWW) dla wideo nie zmienia zachowania.Nawet po zbuforowaniu wideo w AppleTV i braku ponownego strumieniowania, limit czasu nadal występuje.

Jestem pewien, że prośba klienta musi pozostać w kontakcie przez cały czas „odtwarzania” filmu i zgodnie z moją najlepszą wiedzą zakodowałem go, aby to zrobić. Naprawdę jestem na wyczerpaniu. Próbowałem wszystkiego, o czym myślę, włączając w to wykonanie żądania zarówno jako HttpWebRequest, jak i surowego TcpClient (które działają zarówno w obie strony, jak i poza), ustawiając limity czasu Recieve / Send na szalone liczby i zapętlając odczyt strumienia Tcp aby upewnić się, że istnieje „aktywność”.

To tak, jakby AppleTV spodziewa się, że wyślę wiadomość „hej, baw się dalej”, ale jeszcze nie widziałem czegoś takiego z jakiegokolwiek źródła w sieci. Mam nadzieję, że jest to po prostu coś głupiego, którego nie robię w oparciu o mój brak wiedzy o Http / Tcp.

Oto mój kod:

    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

Uwaga: używając telnetu mogę połączyć się z AppleTV na porcie 7000 i wkleić to polecenie, które odtwarza cały film:

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

Używam serwera Cassini Webserver na porcie 82, ale działa to również z IIS. Daje to dalsze dowody na to, że stos .Net robi coś pod maską po 30 sekundach, co powoduje rozłączenie.