我需要在错误的api调用上返回404,以便可以在客户端(角度5)上向用户创建正确的响应。当前后端返回状态码200和index.html,这导致前端json解析错误。
我用ASP.NET Core 2.1和Angular模板项目创建了一个新的Web项目。这是该模板的the link发布版本。我根本没有更改模板代码,我只是将其发布在azure上。 (在开发模式下,我收到404错误,如预期)。
如here所述,默认行为应为404。
Here是Startup.cs
和here 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();
}
但是,尽管可行,但这似乎是错误的。
答案 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
。