如何允许 Web 服务器上的多个用户/进程同时读取一个文件

Dr.*_*len 1 runtime-error audio-streaming c#-4.0 asp.net-web-api2

我在 asp.net webapi 中使用以下代码进行音频流,以允许 Android 应用程序调用 api 并播放歌曲。

 public class AudioController : ApiController
    {
       ITrackRepository _TrackRepo = new TrackRepository();

        public AudioController()
        {

        }

        public HttpResponseMessage Get(int id)
        {
            var trackd = _TrackRepo.GetPlayfilepath(id);

            string filename = System.Web.HttpContext.Current.Server.MapPath(trackd.Select(x => x.FilePath).FirstOrDefault());

            var audio = new AudioStream(filename);
            string fileExtension = System.IO.Path.GetExtension(filename);

            var response = Request.CreateResponse();
            response.Content = new PushStreamContent(audio.WriteToStream, new MediaTypeHeaderValue("audio/" + fileExtension));              
            return response;
        }

    }



 public class AudioStream 
    {
        private readonly string _filename;

        public AudioStream(string filename)
        {

            _filename = filename;
        }

        public async void WriteToStream(Stream outputStream, HttpContent content, TransportContext context)
        {
            try
            {
                var buffer = new byte[65536];

                using (var video = File.Open(_filename, FileMode.Open, FileAccess.Read))
                {
                    var length = (int)video.Length;
                    var bytesRead = 1;

                    while (length > 0 && bytesRead > 0)
                    {
                        bytesRead = video.Read(buffer, 0, Math.Min(length, buffer.Length));
                        await outputStream.WriteAsync(buffer, 0, bytesRead);
                        length -= bytesRead;
                    }
                }
            }
            catch (HttpException ex)
            {
                return;
            }
            finally
            {
                outputStream.Close();
            }
        }

    }
Run Code Online (Sandbox Code Playgroud)

我能够播放歌曲,我用 vlc(流)测试了它,它工作正常,问题是当我尝试在另一个播放器中并行播放同一首歌曲时,它给了我以下错误

该进程无法访问该文件,因为该文件正在被另一个进程使用。

我完全理解错误,但我无法找到任何令人满意的解决方案。

一种解决方案是在播放/流媒体之前创建歌曲的副本并在完成后将其删除,但我认为这不是一个好的解决方案。

请建议。

Ste*_*enP 5

我目前不在装有 Visual Studio 的计算机上,但请查看 File.Open 的此重载尝试更改此行:

using (var video = File.Open(_filename, FileMode.Open, FileAccess.Read))
Run Code Online (Sandbox Code Playgroud)

using (var video = File.Open(_filename, FileMode.Open, FileAccess.Read, FileShare.Read))
Run Code Online (Sandbox Code Playgroud)

看看是否有帮助。