首页 > 解决方案 > UseSpa() 从 API 返回 index.html 而不是 404

问题描述

默认情况下,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");
                }
            });
        }

标签: angularasp.net-coreroutessingle-page-applicationpipeline

解决方案


UseSpamiddlware 是一个包罗万象的工具,任何到达该点的请求都将始终返回默认的 SPA 页面。这意味着对尚未找到控制器的路由的任何请求将始终返回默认的 SPA 页面,而不是抛出 404。

UseSpa()只有在路由没有前缀的情况下才会调用它/api。这实质上允许任何以/api跳过该点开始的请求。

改变:

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

至:

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

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


推荐阅读