Mar*_*gić 6 c# angular asp.net-core-2.1
我需要在错误的api调用上返回404,以便可以在客户端(角度5)上为用户创建正确的响应。当前后端返回状态码200和index.html,这导致前端json解析错误。
我使用ASP.NET Core 2.1和Angular模板项目创建了新的Web项目。这是该模板发布版本的链接。我根本没有更改模板代码,我只是将其发布在azure上。(在开发模式下,我收到404错误,如预期)。
如此处所述,默认行为应为404。
这里是Startup.cs,这里 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" });
});
});
Run Code Online (Sandbox Code Playgroud)
在HomeController.cs:
public IActionResult Error()
{
return NotFound();
}
Run Code Online (Sandbox Code Playgroud)
但这似乎是错误的,尽管它可以工作。
Dou*_*ell 14
注意:根据您的链接,我假设您正在使用app.UseSpa()中间件。
路由中间件按顺序执行,如果请求从未找到控制器,404则返回状态。该UseSpamiddlware是一个包罗万象的,并得到该点总是有默认的SPA页面返回的任何请求。这意味着对尚未找到控制器的路由的任何请求将始终返回默认的 SPA 页面,而不会抛出 404。
什么,你会想这样做,只调用UseSpa()如果路由不带前缀/api。这基本上允许任何以/api跳过该点开头的请求。
代替:
app.UseSpa(spa =>
{
//[Snip]
});
Run Code Online (Sandbox Code Playgroud)
用:
app.MapWhen(x => !x.Request.Path.Value.StartsWith("/api"), builder =>
{
builder.UseSpa(spa =>
{
//[Snip]
});
});
Run Code Online (Sandbox Code Playgroud)
这将允许任何从/api该点开始的请求,如果没有其他中间件或路由匹配,404将返回 a 。