.NET Core 3.1 MVC Razor页audio控件播放UNC音频按钮置灰问题
根本原因
直接在<audio>标签的src属性中填写UNC格式的SMB共享路径无法正常加载,是Chrome等现代浏览器的默认安全策略限制:通过HTTP/HTTPS协议加载的网页,默认禁止直接访问本地文件系统、局域网SMB共享这类非HTTP源的资源,该限制不受站点内容权限、HTTPS证书有效性影响。
手动将UNC路径输入浏览器地址栏可正常播放,是因为此时浏览器直接通过SMB协议发起资源请求,不受网页上下文的安全沙箱规则约束,二者的权限判定逻辑完全独立。
可行解决方案
方案1:后端接口代理文件流(推荐,适配性最好)
不让浏览器直接访问UNC共享资源,由.NET Core后端读取共享路径下的音频文件,以标准HTTP文件流的形式返回给前端,audio标签直接引用本站点的接口地址即可。
- 在对应的Razor Page Model(
playerModel.cshtml.cs)中新增接口处理方法:
public IActionResult OnGetGetAudio() { // 替换为实际的音频文件UNC路径 string audioUncPath = @"\\server.local\shares\folderone\subfolder\vendor\sample.mp3"; var fileStream = new FileStream(audioUncPath, FileMode.Open, FileAccess.Read); // 开启RangeProcessing支持音频进度拖动 return File(fileStream, "audio/mpeg", enableRangeProcessing: true); }
- 修改Razor页面中的audio标签,将src指向本站接口:
<audio controls src="/player?handler=GetAudio"></audio>
方案2:将UNC共享目录挂载为站点静态资源目录
如果所有录音文件都存放在固定的共享目录下,可以直接将该UNC目录配置为.NET Core的静态文件服务目录,由站点统一对外提供该路径下的资源访问。
- 在项目
Startup.cs的Configure方法中新增静态文件配置:
using Microsoft.Extensions.FileProviders; // 省略其他已有配置 app.UseStaticFiles(new StaticFileOptions { // 配置UNC共享路径作为文件源 FileProvider = new PhysicalFileProvider(@"\\server.local\shares\folderone\subfolder\vendor"), // 配置访问路径前缀 RequestPath = "/recording-files", ContentTypeProvider = new FileExtensionContentTypeProvider { Mappings = { [".mp3"] = "audio/mpeg" } } });
- 修改audio标签引用静态资源路径即可:
<audio controls src="/recording-files/sample.mp3"></audio>
注意事项
- 无论使用哪种方案,都需要确保运行.NET Core进程的账号(本地调试时为当前登录系统的账号,IIS部署时为应用池配置的运行身份)对目标UNC共享目录拥有读取权限,否则会出现访问拒绝、资源404的错误。
- 返回音频流时必须开启
enableRangeProcessing配置,否则audio控件会出现无法拖动播放进度、加载异常的问题。
内容的提问来源于stack exchange,提问作者Ruby2022
相关产品推荐
相关产品推荐

