如何在错误的API网址上返回404? (ASP.NET Core + SPA)

时间:2018-09-16 21:24:13

标签: c# angular asp.net-core-2.1

我需要在错误的api调用上返回404,以便可以在客户端(角度5)上向用户创建正确的响应。当前后端返回状态码200和index.html,这导致前端json解析错误。

我用ASP.NET Core 2.1和Angular模板项目创建了一个新的Web项目。这是该模板的the link发布版本。我根本没有更改模板代码,我只是将其发布在azure上。 (在开发模式下,我收到404错误,如预期)。

here所述,默认行为应为404。

HereStartup.cshere SampleDataController.cs

我想到在Startup.cs中使用类似的内容:

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller}/{action}/{id?}");
        });

        app.MapWhen(x => x.Request.Path.Value.Contains("/api"), builder =>
        {
            builder.UseMvc(routes =>
            {
                routes.MapSpaFallbackRoute(
                    name: "spa-fallback",
                    defaults: new { controller = "Home", action = "Error" });
            });
        });

HomeController.cs中:

    public IActionResult Error()
    {
        return NotFound();
    }

但是,尽管可行,但这似乎是错误的。

1 个答案:

答案 0 :(得分:2)

注意:根据您的链接,我假设您正在使用app.UseSpa()中间件。

按顺序执行路由中间件,并且如果请求从未找到控制器,则返回404状态。 UseSpa中间件是万能的,到达该点的任何请求将始终返回默认的SPA页面。这意味着对尚未找到控制器的路由的任何请求将始终返回默认的SPA页面,而不抛出404。

您要执行的操作仅在路由没有前缀UseSpa()的情况下调用/api。本质上,所有以/api开头的请求都可以跳过该点。

代替:

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

使用:

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

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