You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor中点击按钮播放文件共享WAV音频的问题求助

Blazor播放网络共享WAV音频的问题及解决方法

问题描述

我希望在Blazor中点击按钮时,播放位于文件共享地址myabc.com/mysharedfolder/mysharedfile.wav的WAV音频。

尝试方案1:HTML <audio>标签

使用以下代码时控制台报错:

<audio autoplay controls><source src="@mylocation" /></audio>

错误信息:

Not allowed to load local resource:
file://myabc.com/mysharedfolder/mysharedfile.wav

但将路径file://myabc.com/mysharedfolder/mysharedfile.wav直接复制到Edge浏览器地址栏,音频可正常播放。

尝试方案2:NAudio后端播放

按钮绑定点击事件:

OnClick="@(async () => await PlaySound())"

C#实现代码:

using NAudio.Wave;

private async Task PlaySound()
{
    string mylocation = "myabc.com/mysharedfolder/mysharedfile.wav";

    if (File.Exists(mylocation))
    {
        byte[] bytes = System.IO.File.ReadAllBytes(mylocation);

        using (var stream = new MemoryStream(bytes))
        {
            using (var reader = new WaveFileReader(stream))
            {
                using (var waveOut = new WaveOutEvent())
                {
                    waveOut.Init(reader);
                    waveOut.Play();
                    while (waveOut.PlaybackState == PlaybackState.Playing)
                    {
                        System.Threading.Thread.Sleep(200);
                    }
                }
            }
        }
    }
}   

这段代码在本地能正常播放,但部署到网站后无声音。


可行解决方法

1. 用Web服务器API代理共享文件

浏览器沙箱禁止直接加载file://协议的网络资源,部署后的Blazor应用无法绕过这个限制。可以在Web服务器上写一个API接口,负责读取共享文件并以流的形式返回给前端。

示例ASP.NET Core API:

[ApiController]
[Route("api/audio")]
public class AudioController : ControllerBase
{
    [HttpGet("{fileName}")]
    public IActionResult GetAudio(string fileName)
    {
        // 确保服务器进程有权限访问该共享文件夹
        string sharedFilePath = @"\\myabc.com\mysharedfolder\" + fileName;
        if (!System.IO.File.Exists(sharedFilePath))
        {
            return NotFound();
        }

        var fileStream = new FileStream(sharedFilePath, FileMode.Open, FileAccess.Read);
        return File(fileStream, "audio/wav");
    }
}

Blazor前端调用方式:

<button @onclick="PlayAudio">播放音频</button>
<audio @ref="_audioElement" src="/api/audio/mysharedfile.wav" />

@code {
    private ElementReference _audioElement;

    private async Task PlayAudio()
    {
        await _audioElement.InvokeAsync("play");
    }
}

2. 将共享文件夹映射为Web服务器静态资源

如果用IIS部署,可把网络共享文件夹映射为站点的虚拟目录,让文件能通过HTTP/HTTPS访问:

  • 打开IIS管理器,找到你的Blazor站点,右键添加虚拟目录
  • 别名设为audio,物理路径填写\\myabc.com\mysharedfolder
  • 配置应用池身份,确保它有权限访问该共享文件夹

前端直接通过虚拟目录路径访问:

<button @onclick="() => _audioElement.PlayAsync()">播放音频</button>
<audio @ref="_audioElement" src="/audio/mysharedfile.wav" />

@code {
    private ElementReference _audioElement;
}

3. WebDAV协议直接访问(仅限内网场景)

如果共享文件夹所在服务器配置了WebDAV服务,可将file://路径替换为HTTP形式(比如http://myabc.com/mysharedfolder/mysharedfile.wav),直接用<audio>标签加载,前提是浏览器能访问这个WebDAV地址且有权限。


内容的提问来源于stack exchange,提问作者BFry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 16:13:16