VS2022创建Blazor/Maui Server App面向MacOS发布时静态文件丢失问题
根因
ASP.NET Core 应用默认会从进程当前工作目录查找wwwroot静态资源文件夹:
- 在VS IDE内运行时,IDE会自动将工作目录设置为项目根目录/发布输出目录,因此可以正常找到静态资源
- 在Mac上直接双击运行可执行文件、或在其他目录下通过终端启动程序时,默认工作目录为当前用户个人主目录(
~/),程序会尝试从主目录下找wwwroot文件夹,找不到就会返回404。只有将所有发布文件放到主目录时能正常加载的表现也完全符合这个逻辑。
你之前调整的app.UsePathBase()、修改<base href>都是用于处理URL请求路径的映射规则,和物理文件查找路径无关,因此无法解决问题。
可用解决方案
方案1:终端启动时先切换工作目录(临时验证用)
发布后不要直接双击运行可执行文件,打开终端先cd到publish文件夹,再执行启动命令:
cd /path/to/your/publish/folder ./你的应用名称
这种方式不需要改代码,适合临时验证。
方案2:代码强制指定静态资源查找路径(永久修复,推荐)
修改Program.cs文件,在构建WebApplication实例时强制将内容根目录、Web根目录绑定到应用程序自身的所在路径,不受进程工作目录影响:
// 替换原来的 var builder = WebApplication.CreateBuilder(args); 为以下代码 var builder = WebApplication.CreateBuilder(new WebApplicationOptions { Args = args, // 内容根目录设为应用程序自身所在目录 ContentRootPath = Path.GetDirectoryName(AppContext.BaseDirectory), // Web根目录固定为内容根目录下的wwwroot WebRootPath = Path.Combine(Path.GetDirectoryName(AppContext.BaseDirectory) ?? string.Empty, "wwwroot") });
修改后重新发布即可,不管从哪个目录启动应用,都会自动从程序所在目录下的wwwroot加载静态资源。
方案3:双击运行场景下设置工作目录
如果需要打包成可直接双击运行的应用,可在打包生成的.plist配置文件中添加工作目录配置,指定为应用包内的发布文件目录即可。
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

