2009-10-28 7 views
5

Próbuję przesyłać wideo QuickTime do iPhone'a z aplikacji sieci web ASP.NET za pomocą HttpHandler. Podczas hostowania aplikacji internetowej z IIS 5.1 (Windows XP) odtwarzacz wideo otwiera się, a następnie wyświetla komunikat "Serwer nie jest poprawnie skonfigurowany". Jednak przy korzystaniu z IIS 7.5 (Windows 7) wideo gra dobrze.Odtwarzanie wideo QuickTime na iPhone'a przy użyciu HttpHandler i IIS 5.1

W środowisku produkcyjnym są uruchomione usługi IIS 6.0 i występuje ten sam problem, ponieważ próba odtworzenia wideo na telefonie iPhone za pośrednictwem Mobile Safari powoduje wyświetlenie powyższego błędu.

Sprawdziłem nagłówki HTTP i wygląda na to, że są praktycznie takie same między dwoma serwerami (poza kilkoma, takimi jak nagłówek Server, z tą różnicą, że są wyświetlane w innej kolejności , choć wątpię, że to powoduje problem.

Zgodnie z this thread w Grupach dyskusyjnych Google, dodanie nagłówka "Akceptuj zakresy: bajty" może pomóc, ale nie miało to znaczenia dla nas. Dodałem również nagłówek ETag, bez żadnego szczęścia.

Kod faktycznie odpowiedzialny za wysyłanie pliku wygląda mniej więcej tak:

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); 

Powyższy kod, który przenosi pliki wydaje się być prawidłowo funkcjonują i pliki wideo odtwarzane poprawnie we wszystkich przeglądarkach desktopowych i kiedy gospodarzem z IIS 7.5 w systemie Windows 7. Problem jest widoczny tylko podczas próby odtwarzania plików wideo na telefonie iPhone przy użyciu Mobile Safari przy użyciu powyższego kodu z aplikacją WWW ASP.NET hostowaną w IIS 5.1 lub IIS 6.0.

Czy ktoś jeszcze doświadczył czegoś podobnego i ma pomysły na to, co mogę zrobić, aby to zadziałało?

+0

Porada Accept-Ranges pomogła mi z podobnym problemem z ASP.NET MVC. – kim3er

Odpowiedz

2

Dlaczego ustawiasz Response.Buffer na wartość true?

Nie można po prostu dodać nagłówka "Accept-Ranges", dopóki nie upewnimy się, że serwer obsługuje żądania zakresu HTTP. Jeśli odtwarzacz klienta wymaga obsługi żądań zasięgu i serwer odmawia ich obsługi, wydaje się logiczne, że żądanie zostanie odrzucone.

Możesz spróbować użyć Skrzypka jako odwrotnego proxy i sprawdzić, czy IPhone wysyła żądanie zasięgu. http://www.fiddler2.com/Fiddler/Help/ReverseProxy.asp

0

Użyj czegoś takiego jak Skrzypek, aby ujawnić dokładną odpowiedź HTTP pochodzącą z serwerów. Popraw ciąg znaków User-Agent klienta, aby dopasować go do przeglądarki iPhone'a (lub po prostu skorzystaj z Safari?) I porównaj dane wyjściowe z IIS 5.1 i 7.5. Oczywiście strumienie odpowiedzi nie są identyczne lub działałyby na obydwu.

Można również użyć programu NetMon, który jest doskonałym narzędziem ... i umożliwi testowanie za pomocą samego iPhone'a.

Niestety nie mam dla ciebie konkretnej odpowiedzi, ale myślę, że będziesz musiał ubrudzić sobie ręce tym.

+0

Dzięki za porady. Obraz wideo jest dobrze odtwarzany w Safari w systemie Windows, a także w Firefoksie, gdy używamy ciągu znaków użytkownika iPhone'a, więc nie sądzę, że to coś w tym stylu. Wygląda na to, że chodzi bardziej o to, jak IIS5/6 transmitują pliki w przeciwieństwie do IIS7, co nie pozwala iPhone'owi na jego odtwarzanie. Nie korzystałem wcześniej z narzędzi do monitorowania sieci, ale sprawdzę NetMon/Wireshark i zobaczę, czy mogą pomóc. – Mun

3

Po pewnym przeszukaniu natrafiłem na artykuł Range-Specific Requests in ASP.NET, który opisuje dokładny problem, który miałem. Implementacja klasy RangeRequestHandlerBase z tej strony (z niewielkimi modyfikacjami dopasowanymi do istniejącej struktury projektu) najwyraźniej rozwiązała problem, a odtwarzanie wideo działa teraz poprawnie z IIS5/6.

@Eric - Przegrałem Twoją odpowiedź, ponieważ Twój komentarz był skierowany we właściwym kierunku.Po prostu dodanie nagłówka "Accept-Ranges" nie było wystarczające (pomimo pracy w IIS7), a program obsługi http musiał zostać zmodyfikowany, aby obsłużyć żądania zasięgu i zapewnić wysyłanie poprawnych danych.

Powiązane problemy