Jac*_*sen 16 iis-7 range mobile-safari ipad html5-video
我正在为iPad设计一个Web应用程序,它在移动游猎中使用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);
Run Code Online (Sandbox Code Playgroud)
现在让我感到困惑的是请求Safari似乎使用的协议.通过fiddler代理请求,我得到以下aprox 2MB文件.

注意:当请求通过IIS 7直接提供的mp4文件时,协议和请求数量是相同的
如果文件较大,则最后的步骤将更多.我已经测试了多达99个请求,其中每个请求包含文件的一部分平均分割.这是有道理的,也是我认为的预期.我无法理解的是,为什么它在最后请求不同部分的文件之前对前2个字节做出2个初始请求以及为整个文件做出2个请求.
当我得出结论时,这导致文件被下载2-3次,具体取决于文件的长度以及用户是否足够长时间观看.
任何人都可以理解这种行为,并解释我可以做些什么来防止多次下载.谢谢.
根据我对你的问题的评论,我过去也遇到过类似的问题。如果您可以控制服务器(我没有),您可以尝试的一件事是禁用文件的 gzip 或身份编码。我相信在对整个内容的第一个请求(列表中的#2)中,它要求使用 gzip 编码(压缩)的内容。也许您可以将 IIS 配置为不为 gzip 编码请求提供文件服务。
这是我关于这个主题的原始(未回答)问题: