我正在爲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文件。
注意:當請求mp4文件,直接通過IIS 7提供服務,協議和的請求量是相同的
- 首先,它要求2個字節這使得它能夠讀'Content-Range'標題。
- 現在要求的全部內容
- (?) -
- 它再次進入執行步驟1 & 2.(??)
- -
- 現在請求文件的唯一部分( ???)
如果文件比較大,最後的步驟會多得多。我已經測試了多達99個請求,其中每個請求包含等分文件的一部分。這是有道理的,而且是我所期望的。我無法理解的是,爲什麼在最終請求文件的不同部分之前,它會對前2個字節進行2次初始請求,並對整個文件進行2次請求。
由於我的結果是文件被下載2-3次,具體取決於文件的長度以及用戶是否觀看足夠長的時間。
任何人都可以理解這種行爲,也許可以解釋我可以做些什麼來防止多次下載。謝謝。
我遇到了同樣的事情。它也ipod,如果你正在處理MP3文件。不幸的是沒有解決方案... – worenga 2011-06-17 23:08:41
我注意到一個非常大的(30meg)視頻也一樣。當請求來自iPad時,有時候會有3次請求整個文件! – 2011-08-26 21:01:51
我對MPMoviePlayerController中的mp3文件有相同的經驗。這是我問到的問題,這個問題沒有得到答覆。我的問題有更多關於正在提出的請求的信息。 http://stackoverflow.com/questions/4855485/mpmovieplayercontroller-not-playing-full-length-mp3 – TomSwift 2011-12-14 21:06:19