升级至.Net Core:如何让Staging与Production槽共享公共视频课程目录
LMS媒体文件共享存储解决方案(.NET Core迁移)
核心思路
把6小时的视频课程从应用内部目录剥离,放到独立的共享存储服务/目录,让Staging和Production部署槽通过统一配置访问,彻底避免重复上传数GB文件的问题。
具体实现方案
1. 云环境首选:对象存储服务
如果是Azure、AWS这类云平台部署:
- 用Blob存储(Azure Blob Storage)或对象存储(AWS S3)创建专属容器,把所有视频上传到容器中。
- 在.NET Core应用的
appsettings.json中配置存储连接字符串和容器名称,通过IConfiguration读取后,封装一个媒体服务:- 要么生成预签名临时URL给前端(适合需要权限控制的场景),要么直接配置静态资源映射(如果允许公开访问)。
- 优势:自带冗余、可弹性扩容,两个部署槽完全共享同一份文件,无需任何同步操作。
2. 本地/私有部署:网络共享目录
如果是自建服务器环境:
- 搭建SMB/NFS网络共享目录,把视频文件放到这个共享目录下。
- 在两个部署槽的服务器上挂载该共享目录,然后在.NET Core中配置静态文件访问:
var builder = WebApplication.CreateBuilder(args); builder.WebHost.Configure(app => { var sharedPath = builder.Configuration["Courses:SharedPath"]; // 从配置读取共享路径 app.UseStaticFiles(new StaticFileOptions { FileProvider = new PhysicalFileProvider(sharedPath), RequestPath = "/Courses" // 保持原访问路径不变,兼容旧链接 }); }); - 注意:给应用运行用户(比如App Pool账户)分配共享目录的读写权限。
3. 部署槽统一配置技巧
不管用哪种存储方式,都要把存储路径/连接字符串放到应用级配置(比如Azure App Service的配置中心、本地的环境变量),不要硬编码:
- 给Staging和Production槽设置完全相同的配置项(比如
COURSES_STORAGE_CONFIG),确保两个槽指向同一个存储源。 - 这样后续更新存储位置时,只需要修改配置,不用重新部署应用。
4. 安全与性能优化
- 不要直接暴露存储地址:通过API接口代理视频请求,比如写一个
/courses/{videoName}接口,内部从存储读取文件流返回给客户端,同时可以加身份验证、访问统计、限流逻辑。
示例代码:[HttpGet("courses/{videoName}")] public async Task<IActionResult> StreamVideo(string videoName) { var storagePath = _configuration["Courses:SharedPath"]; var fullPath = Path.Combine(storagePath, videoName); if (!System.IO.File.Exists(fullPath)) return NotFound(); // 支持断点续传 var fileStream = new FileStream(fullPath, FileMode.Open, FileAccess.Read); return File(fileStream, "video/mp4", enableRangeProcessing: true); } - 启用范围请求:上面代码中的
enableRangeProcessing: true可以让客户端实现断点续传,提升大视频的加载体验。
迁移步骤
- 把原.NET Framework应用
Courses文件夹中的视频批量迁移到新的共享存储。 - 在Staging槽配置好存储访问逻辑,测试视频播放是否正常。
- 验证无误后,同步Production槽的配置,确保两个槽都指向同一存储。
- 清理原应用目录中的
Courses文件夹,释放服务器空间。
关键注意事项
- 给共享存储设置严格的访问权限,只允许应用服务器访问,防止数据泄露。
- 定期备份共享存储中的视频文件,避免意外丢失。
- 如果用云存储,开启CDN加速,提升全球用户的视频加载速度。
内容的提问来源于stack exchange,提问作者Roddy Balkan
相关产品推荐
相关产品推荐

