IHttpHandler ProcessRequest仅由Safari调用两次

时间:2014-11-28 21:39:08

标签: asp.net safari http-headers video-streaming html5-video

我有一个网络应用程序,可以预览上传的媒体内容(图像,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被调用两次并在第三次请求时失败。 (忽略下图中的第一行。)

Safari makes three requests while every other browser is able to retrieve the video from the first request. 第一个请求来自实际的浏览器。 This first request makes sense. It is the browser trying to get the data 来自用户代理AppleCoreMedia的第二个请求。 Second request 第三个来自Quicktime。 Third request

为什么会这样?我发现的唯一类似问题是在http://www.hanselman.com/blog/InternetExplorerAndTheMagicOfMicrosoftKBArticleQ293792.aspx,这并不是非常相关。预览适用于safari上的所有其他媒体类型(swf,png,jpg),它不会发出多个请求。最终的302响应代码没有意义,因为视频位置永远不会改变。提前谢谢你。

1 个答案:

答案 0 :(得分:0)

所以我终于解决了这个问题。 Safari要求视频流使用206 Partial Content标头。我实现了我在http://blogs.visigo.com/chriscoulson/easy-handling-of-http-range-requests-in-asp-net/找到的代码,一切正常!