使用 Spa() returns index.html 来自 API 而不是 404

UseSpa() returns index.html from API instead of 404

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

我想在路由 /api/* 为我的 API 呼叫保留 404,以防万一 api url 中的错字成为我的记录器会记录 404 而不是像“错误代码:200 消息:解析 https://localhost:5001/api/non-existing-api-should-give-404 期间的 Http 失败”(因为它得到 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");
                }
            });
        }

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

如果路由没有前缀 /api,您将只调用 UseSpa()。这实质上允许任何以 /api 开头的请求跳过该点。

变化:

app.UseSpa(spa =>
{
    //...
});

收件人:

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

这将使任何以 /api 开头的请求超过该点,如果没有其他中间件或路由匹配,404 将被 returned。