.NET Core中Web API搭配SPA重定向的配置问题
解决ASP.NET Core + Vite SPA开发环境下API异常被代理返回404的问题
你的问题出在中间件执行顺序和UseSpa的默认行为上:UseSpa会捕获所有未被前面中间件处理的请求(包括API路由抛出异常的请求),并转发给Vite,而Vite没有对应API路径的路由,所以返回无意义的404,掩盖了真实的API异常。
可以通过调整中间件配置实现API路由优先处理,只有当请求完全不匹配API路由时才走SPA代理,同时保留开发者异常页的功能,具体配置如下:
if (app.Environment.IsDevelopment()) { app.UseDeveloperExceptionPage(); // 优先处理API控制器路由 app.MapControllers(); // 仅对非API请求启用SPA代理 app.MapWhen(context => // 根据你的API路由前缀调整,比如统一用/api开头 !context.Request.Path.StartsWithSegments("/api"), spaPipeline => { spaPipeline.UseSpa(spa => { spa.UseProxyToSpaDevelopmentServer("http://localhost:5173"); }); }); }
配置说明
- 中间件顺序:
MapControllers()放在UseSpa之前,确保所有匹配API控制器的请求会被优先处理。如果API抛出异常,UseDeveloperExceptionPage会直接捕获并显示详细错误信息,不会进入SPA代理流程。 - 请求过滤:
MapWhen用来筛选请求,只有路径不匹配API前缀的请求(比如前端页面路由、静态资源请求)才会被转发到Vite,既保留了SPA的正常开发体验,又不会掩盖API的异常。
如果你的API没有统一的/api前缀,可以根据实际情况调整MapWhen的判断条件,比如通过请求头或路径特征区分:
app.MapWhen(context => // 排除API和Swagger路径,根据你的实际情况修改 !context.Request.Headers.Accept.ToString().Contains("application/json") && !context.Request.Path.StartsWithSegments("/swagger"), spaPipeline => { /* SPA代理配置 */ });
内容的提问来源于stack exchange,提问作者Tanktalus
相关产品推荐
相关产品推荐

