我有一个网络应用程序,可以预览上传的媒体内容(图像,MP3,swf文件和视频)。所有上传的视频都使用HTML5视频标记正确编码和播放。
strHTML += '<video id="' + ObjectID + '" controls preload="auto" width="' + WIDTH + '" height="' + HEIGHT + '">' +
'<source src="' + URL + '" type="video/mp4" />' +
'</video>';
我有一个源处理程序,它将上面的URL映射到服务器上的正确目录。
public class SrcUrlHandler : IHttpHandler, IRequiresSessionState
{
public void ProcessRequest(HttpContext context)
{
//if previewing videos
string filename = string.IsNullOrEmpty(spot.MEDIA_FILE) ? string.Empty : spot.MEDIA_FILE.Trim();
string fileDir = tmpl.GetClientContentDirectory((int)clientId, ClientContentDirectory.Working);
string fullName = fileDir + Path.DirectorySeparatorChar + "standardized_spid_" + spot.SPOT_ID + ".mp4";
if (!File.Exists(fullName))
return;
FileInfo file = new FileInfo(fullName);
context.Response.Clear();
context.Response.Cache.SetCacheability(HttpCacheability.Public);
context.Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);
context.Response.ContentType = "video/mp4";
context.Response.TransmitFile(file.FullName);
context.ApplicationInstance.CompleteRequest();
}
}
适用于Windows中的FF,IE,Chorme和OSX中的Chrome。然而,这在OSX上的Safari失败了。出于某种原因,Safari会发出三个http请求。 ProcessRequest被调用两次并在第三次请求时失败。 (忽略下图中的第一行。)
第一个请求来自实际的浏览器。 来自用户代理AppleCoreMedia的第二个请求。 第三个来自Quicktime。
为什么会这样?我发现的唯一类似问题是在http://www.hanselman.com/blog/InternetExplorerAndTheMagicOfMicrosoftKBArticleQ293792.aspx,这并不是非常相关。预览适用于safari上的所有其他媒体类型(swf,png,jpg),它不会发出多个请求。最终的302响应代码没有意义,因为视频位置永远不会改变。提前谢谢你。
答案 0 :(得分:0)
所以我终于解决了这个问题。 Safari要求视频流使用206 Partial Content标头。我实现了我在http://blogs.visigo.com/chriscoulson/easy-handling-of-http-range-requests-in-asp-net/找到的代码,一切正常!