2011-05-23 57 views
16

我正在爲iPad設計一個Web應用程序,該應用程序在移動Safari中使用HTML5。我通過運行.NET Framework v2.0的IIS 7上託管的ASP.NET .ashx文件手動傳輸文件。Mobile Safari發出多個視頻請求

的基本代碼如下部分是這樣的:

// If we receive range header only transmit partial file 
if (context.Request.Headers["Range"] != null) 
{ 
    var fi = new FileInfo(filePath); 
    long fileSize = fi.Length; 

    // Read start/end index 
    string headerRange = context.Request.Headers["Range"].Replace("bytes=", ""); 
    string[] range = headerRange.Split('-'); 
    int startIndex = Convert.ToInt32(range[0]); 
    int endIndex = Convert.ToInt32(range[1]); 

    // Add header Content-Range,Last-Modified 
    context.Response.StatusCode = (int)HttpStatusCode.PartialContent; 
    context.Response.AddHeader(HttpWorkerRequest.GetKnownResponseHeaderName(HttpWorkerRequest.HeaderContentRange), String.Format("bytes {0}-{1}/{2}", startIndex, endIndex, fileSize)); 
    context.Response.AddHeader(HttpWorkerRequest.GetKnownResponseHeaderName(HttpWorkerRequest.HeaderLastModified), String.Format("{0:r}", fi.CreationTime)); 

    long length = (endIndex - startIndex) + 1; 
    context.Response.TransmitFile(filePath, startIndex, length); 
} 
else 
    context.Response.TransmitFile(filePath); 

現在什麼混淆我沒有盡頭爲請求Safari瀏覽器似乎使用的協議。從代理通過提琴手的請求我得到以下aprox 2MB文件。

Fiddler requests

注意:當請求mp4文件,直接通過IIS 7提供服務,協議和的請求量是相同的

  1. 首先,它要求2個字節這使得它能夠讀'Content-Range'標題。
  2. 現在要求的全部內容
  3. (?) -
  4. 它再次進入執行步驟1 & 2.(??)
  5. -
  6. 現在請求文件的唯一部分( ???)

如果文件比較大,最後的步驟會多得多。我已經測試了多達99個請求,其中每個請求包含等分文件的一部分。這是有道理的,而且是我所期望的。我無法理解的是,爲什麼在最終請求文件的不同部分之前,它會對前2個字節進行2次初始請求,並對整個文件進行2次請求。

由於我的結果是文件被下載2-3次,具體取決於文件的長度以及用戶是否觀看足夠長的時間。

任何人都可以理解這種行爲,也許可以解釋我可以做些什麼來防止多次下載。謝謝。

+0

我遇到了同樣的事情。它也ipod,如果你正在處理MP3文件。不幸的是沒有解決方案... – worenga 2011-06-17 23:08:41

+0

我注意到一個非常大的(30meg)視頻也一樣。當請求來自iPad時,有時候會有3次請求整個文件! – 2011-08-26 21:01:51

+0

我對MPMoviePlayerController中的mp3文件有相同的經驗。這是我問到的問題,這個問題沒有得到答覆。我的問題有更多關於正在提出的請求的信息。 http://stackoverflow.com/questions/4855485/mpmovieplayercontroller-not-playing-full-length-mp3 – TomSwift 2011-12-14 21:06:19

回答

1

根據我對你的問題的評論,我以前有過類似的問題。有一件事你可以嘗試,如果你有控制服務器(我沒有)是禁用gzip或文件的身份編碼。我相信,在整個內容的第一次請求中(列表中的#2),它要求使用gzip編碼(壓縮)的內容。也許你可以配置你的IIS不要爲gzip編碼請求提供文件。

下面是關於這個問題我原來(解答)問題:

https://stackoverflow.com/questions/4855485/mpmovieplayercontroller-not-playing-full-length-mp3