2009-10-28 37 views
5

我想從使用HttpHandler的ASP.NET Web應用程序將QuickTime視頻流式傳輸到iPhone。當從IIS 5.1(Windows XP)託管Web應用程序時,視頻播放器將打開,然後顯示錯誤「服務器未正確配置」。但是,使用IIS 7.5(Windows 7)時,視頻播放正常。使用HttpHandler和IIS 5.1在iPhone上播放Quicktime視頻

生產環境正在運行IIS 6.0,並且存在相同的問題,嘗試通過Mobile Safari在iPhone上播放視頻時顯示上述錯誤。

我檢查HTTP標頭,他們似乎是幾乎在兩個服務器之間是相同的(除了少數,如服務器頭,這顯然是不同的),除非他們出現在不同的順序儘管我懷疑這是造成這個問題的原因。

根據Google Groups上的this thread,添加'Accept-Ranges:bytes'標頭可以提供幫助,雖然這對我們沒有任何影響。我也添加了ETag頭,沒有任何運氣。

的發送文件實際負責的代碼看起來是這樣的:

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

高於該傳輸文件中的代碼似乎正常和視頻文件中的所有桌面瀏覽器可以正常播放,並從IIS託管時7.5。在使用移動Safari在iPhone上播放視頻文件時,只有在IIS 5.1或IIS 6.0上託管ASP.NET Web應用程序的情況下使用上述代碼纔會顯示問題。

有沒有其他人經歷過這樣的事情,並得到我能做些什麼來得到這個工作的任何想法?

+0

Accept-Ranges提示幫助我解決了與ASP.NET MVC類似的問題。 – kim3er 2010-02-18 16:08:28

回答

2

爲什麼你將Response.Buffer設置爲true?

除非還確保服務器支持HTTP範圍請求,否則不能簡單地添加「Accept-Ranges」標頭。如果客戶端播放器要求支持範圍請求並且服務器拒絕處理它們,那麼請求將被拒絕似乎是合乎邏輯的。

您可以嘗試使用Fiddler作爲反向代理並查看IPhone是否發出Range請求。 http://www.fiddler2.com/Fiddler/Help/ReverseProxy.asp

0

使用類似Fiddler的方式公開來自服務器的確切HTTP響應。默認客戶端的用戶代理字符串以匹配iPhone瀏覽器(或僅使用Safari?)並比較IIS 5.1和7.5的輸出。很明顯,響應流不完全相同,或者兩者都有效。

你也可以使用NetMon,這是一個偉大的工具...並且可以讓你測試iPhone本身。

對不起,我沒有具體的答案給你,但我認爲你將不得不用這個手弄髒你的手。

+0

感謝您的提示。該視頻在Windows上的Safari中實際播放效果良好,在使用iPhone用戶代理字符串時也在Firefox中播放,所以我不認爲這是與此相關的。這個問題看起來更像是IIS5/6如何傳輸文件,而不是IIS7,它不允許iPhone播放它。以前沒有使用網絡監控工具,但會檢查NetMon/Wireshark並查看它們是否可以提供幫助。 – Mun 2009-10-28 14:09:52

3

經過一番搜索,我遇到了文章Range-Specific Requests in ASP.NET,它描述了我所遇到的確切問題。從本站實施RangeRequestHandlerBase類(爲適應我們現有的項目結構進行了一些小的修改)似乎已經解決了這個問題,並且視頻回放現在可以在IIS5/6中正確運行。

@Eric - 我已經upvoted你的答案,因爲你的意見是正確的方向微調。只需添加'Accept-Ranges'標頭是不夠的(儘管在IIS7中工作),並且需要修改http處理程序來處理範圍請求並確保正在發送正確的數據。