c# - 通过 MVC3 提供音频文件的问题 |使用各种 HTML5 播放器

标签 c# .net asp.net-mvc-3 html audio

我最近遇到了一个我似乎无法解决的问题。我正在为播放音频文件(主要是 .mp3 和 .wav)的应用程序创建一个简单的组件,在进行一些测试后,该应用程序似乎在 Chrome 中运行良好。

但是在 IE9 中,这是我唯一关心的主要浏览器,我在提供音频文件时似乎遇到了障碍。

当前正在通过 Controller Action 请求文件,如下所示:

public ActionResult PlayAudioFile(string id)
{     
    AudioFile af = FileAgent.GetAudioFile(id);

    try
    {
          //Grabs the file via a Provider
          Stream resultStream = StorageProvider[af.Provider].ReadFile(af.Location);
          resultStream.Position = 0;

          //Added several headers in attempts to resolve the issues
          Response.AppendHeader("Content-Disposition", "attachment; filename=audio.mp3");
          Response.AppendHeader("Content-Length", resultStream.Length.ToString());
          Response.AddHeader("Accept-Ranges", "bytes");
          Response.Headers.Remove("Cache-Control");
          Response.AddHeader("Content-Range","bytes 0-" + (resultStream.Length-1).ToString() + "/" + resultStream.Length.ToString());

          //Returns the file and associated file type (from the Provider)
          return new FileStreamResult(resultStream, resultStream.ContentType);
     }
     catch
     {
            //Uh oh. Error
     }         
}

以上内容适用于 Chrome,并且适用于各种 HTML5 播放器,例如 jPlayer , audio.js MediaElement .但是,当文件被类似以下内容请求时 (使用 jPlayer 语法):

$(this).jPlayer("setMedia", {
    mp3: '@Url.Action("PlayAudioFile","Home")?id=D00023',
});

或 audio.js 语法:

player.load('@Url.Action("PlayAudioFile","Home")?id=D00023');

和关联的 audio.js 音频标签:

<audio preload="auto" crossorigin="use-credentials"></audio>

它会触发正确的操作并返回 FileStreamResult,但似乎所有玩家都难以破译文件并正确读取它。我试过几个播放器,都遇到过同样的问题。

我们非常欢迎任何建议。谢谢。

注意事项:

  • 如其中一条评论所述,我尝试使用多种评论类型来解决此问题。这些都没有用。

  • 在探索此问题的一些可能根本原因时,我注意到删除 [Authorize] 属性可以解决直接访问文件的一些问题,但所有播放器都无法在 IE9 中加载文件.

  • 我现在确信这可能是凭据问题,当我需要通过 jPlayer 或 audio.js(或您拥有的)请求文件时,我需要包含必要的凭据以允许它访问通过 Controller 传输文件。

  • 尝试使用 $.ajax({ withCredentials: true})<audio crossorigin='use-credentials> .都没有成功。

header 信息:

两个请求(Chrome 中的工作请求和 IE9 中的非功能性请求)都具有这些相同的 header :

Cache-Control: public, max-age=3600, s-maxage=0
Date: [Current Date Time]
Expires: [Current Date Time + max-age]
Vary: *

Content-Length: 77870
Content-Type: audio/mpeg
Last-Modified: [Date]

Accept-Ranges: bytes
Content-Range: bytes 0-77869/77870
Server: Microsoft-IIS/7.5

最佳答案

是的。不要将音频作为 application/octet-stream(仅指示通用内容)提供,而是作为 audio/mp3audio/wavesome other appropriate contentType与您提供的音频相匹配。

关于c# - 通过 MVC3 提供音频文件的问题 |使用各种 HTML5 播放器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11891700/

相关文章:

c# - 引用 C# 'dynamic' 对象的动态成员

c# - 到达代码,不执行并无错误退出

c# - 以不同域上的特定用户身份写入目录

c# - MVC3 Ajax.BeginForm OnSuccess 无法在 Firefox 中运行

C# 覆盖 OnActionExecutingAsync Web API 调用

C# 将方法中的更改保留在范围之外

c# - 从文本文件中读取有效的电子邮件地址

asp.net-mvc - 在MVC项目中从 Controller 访问服务层

asp.net-mvc-3 - 如果填充了另一个字段,则 MVC 3 字段为必填字段

c# - Xamarin 表单绑定(bind)标签 IsVisibleProperty