UseSpa() 从 API 返回 index.html 而不是 404

Mar*_*cin 4 pipeline routes single-page-application asp.net-core angular

默认情况下,startup.cs 中的 .UseSpa() 捕获到达管道点的每个请求,并尝试将其作为对 SPA 主页的请求进行处理

我想在路由 /api/* 处为我的 API 调用保留 404,以防万一 api url 中出现拼写错误时,我的记录器会记录 404,而不是像“错误代码:200 消息:解析 https 期间 Http 失败: //localhost:5001/api/non-existing-api-should-give-404"(因为它得到了index.html作为响应)

已经花了一天的时间在这上面,我找不到解决方案:( UseSpa() 似乎覆盖了任何不匹配的端点。有什么想法如何解决它吗?

这是 Startup.cs 的基本配置,问题出在生产环境中。

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseHttpsRedirection();
            if (!env.IsDevelopment())
            {
                app.UseSpaStaticFiles();
            }

            app.UseRouting();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });

            app.UseSpa(spa =>
            {
                if (env.IsDevelopment())
                {
                    spa.UseProxyToSpaDevelopmentServer("http://127.0.0.1:4200");
                }
            });
        }
Run Code Online (Sandbox Code Playgroud)

Ren*_*ena 16

中间件UseSpa是一个包罗万象的东西,任何到达该点的请求都将始终返回默认的 SPA 页面。这意味着对尚未找到控制器的路由的任何请求将始终返回默认 SPA 页面,并且不会抛出 404。

UseSpa()仅当路由不带前缀时,您才需要执行此操作/api。这本质上允许任何以该点开头的请求/api跳过该点。

改变:

app.UseSpa(spa =>
{
    //...
});
Run Code Online (Sandbox Code Playgroud)

到:

app.MapWhen(x => !x.Request.Path.Value.StartsWith("/api"), builder =>
{
    builder.UseSpa(spa =>
    {
        //...
    });
});
Run Code Online (Sandbox Code Playgroud)

这将允许任何从该点开始的请求/api,如果没有其他中间件或路由匹配,404则将返回 a。

  • 我的错误...我在 MapWhen 中使用了 app.UseSpa() 而不是 builder.UseSpa() - 代码编译,但是这个愚蠢的错误花了我很多时间...我必须更加小心地使用我那种类型的功能。谢谢@Rena!你太棒了! (2认同)