ASP.NET Boilerplate项目将Angular产物部署到API wwwroot的配置问题
ASP.NET Boilerplate + Angular 单端口同域部署配置方案
Angular静态资源与.NET Core API完全可以运行在同一个端口,按以下步骤配置即可解决所有异常问题:
1. 前置Angular打包配置
- 打开Angular项目的
environment.prod.ts,修改apiBaseUrl为空字符串,不要写死带端口的地址,让接口请求走当前部署域的相对路径 - 执行打包命令时指定基础路径:
ng build --prod --base-href /,确保打包后静态资源的引用路径正确 - 把dist目录下所有文件直接复制到.NET Core API项目的
wwwroot目录下,不要嵌套多余的子文件夹
2. .NET Core 中间件配置
中间件的顺序会直接影响路由匹配结果,Configure方法请按以下顺序配置:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory) { // 优先配置默认文件,访问根路径时自动匹配加载index.html app.UseDefaultFiles(); // 托管wwwroot下的静态资源,包含Angular打包产物 app.UseStaticFiles(); // 按ABP默认要求配置CORS、认证、授权中间件,需放在路由之前、静态文件配置之后 app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); // 配置API端点路由,ABP动态API会自动注册到该规则中 app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); // 关键:Angular路由回退规则,所有非API、非静态资源的请求都返回index.html,交给前端路由处理 app.MapWhen(x => !x.Request.Path.Value.StartsWith("/api") && !x.Request.Path.Value.StartsWith("/swagger") && !x.Request.Path.Value.StartsWith("/Abp") && !x.Request.Path.Value.StartsWith("/.well-known"), builder => { builder.UseRouting(); builder.Run(async context => { context.Response.ContentType = "text/html"; await context.Response.SendFileAsync(Path.Combine(env.WebRootPath, "index.html")); }); }); // 测试阶段已关闭HTTPS的请移除app.UseHttpsRedirection()配置 }
3. 遗留问题修复
登录接口400报错
- 检查
appsettings.json中的ServerRootAddress、ClientRootAddress配置为当前部署的域名/地址,两个地址保持完全一致 - 确认Angular打包后的
index.html中<base href="/">配置正确,没有多余的子路径
手动输入前端路由404
上述路由回退规则已经覆盖该场景,所有匹配不到静态文件和API接口的请求都会返回index.html,Angular路由会自动处理对应页面跳转,不需要额外配置URL重写模块
AbpUserConfiguration接口200但内容异常
该异常是因为之前没有配置路由回退的排除规则,接口请求被误返回了index.html的内容,上述配置中已将/Abp开头的接口路径排除在回退规则外,请求会正常进入接口处理逻辑返回JSON格式数据
内容的提问来源于stack exchange,提问作者Dino
相关产品推荐
相关产品推荐

