如何正确提供的数据?

我正在为HTML5音频彻底的.aspx页面提供二进制数据。 该文件可以播放,但SeekBar存在问题,并在Safari(iPad),Chrome和Firefox中重放。
编辑我简化了(希望不是太多)代码和完整列表(页面文件名显然是play.aspx)。

    protected void Page_Load(object sender, EventArgs e) { if ( Request["filename"] != null) { string FilePath = MapPath(Request["filename"]); long fSize = (new System.IO.FileInfo(FilePath)).Length; //Headers Response.AddHeader("Content-Length",fSize.ToString()); Response.ContentType = "audio/mp3"; //Data Response.WriteFile(FilePath); Response.End(); }; }   

Direct

Provided

因此提供了Content-LengthContent-Type标头。 当直接访问文件或通过.aspx页面访问文件时,两个标签启用比较行为。

问题是如何在所有必需的浏览器(ff,safari,chrome,IE9 +)上正确地为标签提供数据。

问题

Safari(iPad):当按下播放按钮时,会播放声音,但有“Streaming …”而不是Seek Bar,播放似乎永远持续,声音无法播放。
Firefox(窗口):显示搜索栏但显示增加的时间直到结束并在重放时表现正常。
Chrome(Windows):正确搜索栏但无法重播。
IE10:好的

我找到了类似的问题,但没有答案。 从fiddler观察另一个页面看来,标题Accept-Ranges: bytesContent-Range: bytes 0-8100780/8100781可以提供帮助。 但是提供必要的function似乎太难了,因为只是一次尝试,所以我没有尝试。

注意我正在寻找解决其他连接问题的解决方案如何在IE(9+)和Safari(Pad)中使用HTML5音频播放.m4a?

简单回答:有必要处理浏览器range request

完整的故事

当比较Fiddler在Firefox和IIS之间捕获的通信时,我注意到直接链接的响应状态是206 Partial Content而间接链接200 OK
更仔细地分析请求显示Firefox请求Range: bytes=0-和iPad Range: bytes=0-1和更高版本Range: bytes=0-fullsize ( 从iOS设备捕获流量 )。
设置Response.StatusCode = 206足以欺骗Firefox而不是Safari。 但我知道关键信息和rest很简单。 有必要遵守range请求,请参阅:SO: HTML5video不会循环播放 。 我在阿哈找到了怎么做的解释! #1 – 用于HTML5video的ASP.NET ASHXvideo流 。 所以新代码是(只有活动部分呈现rest与答案中相同):

  protected void Page_Load(object sender, EventArgs e) { if ( Request["filename"] != null) { string FilePath = MapPath(Request["filename"]); long fSize = (new System.IO.FileInfo(FilePath)).Length; long startbyte = 0; long endbyte=fSize-1; int statusCode =200; if ((Request.Headers["Range"] != null)) { //Get the actual byte range from the range header string, and set the starting byte. string[] range = Request.Headers["Range"].Split(new char[] { '=','-'}); startbyte = Convert.ToInt64(range[1]); if (range.Length >2 && range[2]!="") endbyte = Convert.ToInt64(range[2]); //If the start byte is not equal to zero, that means the user is requesting partial content. if (startbyte != 0 || endbyte != fSize - 1 || range.Length > 2 && range[2] == "") {statusCode = 206;}//Set the status code of the response to 206 (Partial Content) and add a content range header. } long desSize = endbyte - startbyte + 1; //Headers Response.StatusCode = statusCode; Response.ContentType = "audio/mp3"; Response.AddHeader("Content-Length",desSize.ToString()); Response.AddHeader("Content-Range", string.Format("bytes {0}-{1}/{2}", startbyte, endbyte , fSize)); //Data Response.WriteFile(FilePath,startbyte,desSize); Response.End(); }; } 

添加其他标题( Content-DispositionAccept-RangesAccess-Control-Allow-Origin )可能很方便,但目的是提供尽可能简单的解决方案。

课程 :如果我没有修复并且也查找 ,我会更快地找到解决方案。