【发布时间】:2011-08-30 23:24:03
【问题描述】:
我正在为 iPad 设计一个 Web 应用程序,它在移动 safari 中使用 HTML5。我通过运行 .NET Framework v2.0 的 IIS 7 上托管的 ASP.NET .ashx 文件手动传输文件。
基本代码部分如下所示:
// 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 似乎使用的协议。通过 fiddler 代理请求,我得到了大约 2MB 文件的以下内容。
注意:当请求 mp4 文件时,直接通过 IIS 7 提供服务,协议和请求量是相同的
- 首先它请求 2 个字节,以便读取“Content-Range”标头。
- 现在它请求整个内容 (?)
- -
- 它继续执行第 1 步和第 2 步 (??)
- -
- 它现在只请求文件的一部分 (???)
如果文件更大,最后的步骤会更多。我测试了多达 99 个请求,其中每个请求都包含文件的一部分,均等分。这是有道理的,也是我认为的预期。我无法理解的是为什么它在最终请求不同部分的文件之前对前 2 个字节发出 2 个初始请求以及对整个文件发出 2 个请求。
根据我的结论,这会导致文件被下载 2 到 3 次,具体取决于文件的长度以及用户观看的时间是否足够长。
任何人都可以理解这种行为并解释我可以做些什么来防止多次下载。谢谢。
【问题讨论】:
-
我遇到了同样的事情。它也是 ipod,如果您正在处理 mp3 文件。不幸的是没有解决方案......
-
我注意到一个非常大 (30meg) 的视频也是如此。当请求来自 iPad 时,有时 3 次请求整个文件!
-
这称为渐进式下载。您确实应该支持 206 个视频文件的部分下载请求。我个人对 ASP 一无所知,所以我无法给出一个我知道有效的实际示例,但谷歌“在 ASP 中实现 http 206 下载支持”或询问与此相关的更具体的问题,以获取有关如何操作的更多详细信息继续。
-
我对 MPMoviePlayerController 中的 mp3 文件也有同样的体验。这是我问过的一个问题,但没有得到回答。我的问题有更多关于正在提出的请求的信息。 stackoverflow.com/questions/4855485/…
标签: ipad iis-7 mobile-safari range html5-video