API url in ASP.NET 核心错误

Wrong API url in ASP.NET Core

我在 ASP.NET 核心应用程序中有 API 控制器,如下所示。

[Route("api")]
public class UserController : Controller
{
    [HttpGet("{userName}/product_info")]
    public IActionResult GetProductInfo(string userName)
    {
        List<ProductInfo> productInfos = _repo.GetProductInfoByUserName(userName);
        if (productInfos.Count > 0)
            return Ok(productInfos);
        else
            return BadRequest("Unable to process requrest");
    }
}

我可以使用 /api/{username}/product_info 在 API 上面调用。 当用户输入错误的 url 时,我使用 UseStatusCodePagesWithRedirects() 重定向到 404 页面。这里的问题是当我使用错误的 API url 例如 /api/{username}/product_o 时。它重定向到 404 页面和 return 的状态代码 200。我将此 API 与 angular.js 一起使用。由于 API returns 404 页面错误 URL 状态代码为 200,$httpthen 方法的错误函数永远不会被调用并且在 response.data 我得到了 404 页面的 HTML。如何在错误的 API URL 被调用时 return 404 的状态码,以及在错误的 NON API URL 被调用时 return 正常的 404 页面? 下面是我调用错误 API URL 时得到的屏幕截图。

基于@Daboul 对 this link 的建议和解决方案 在 startup.csconfigure 方法中添加以下部分有效。

Func<HttpContext, bool> isApiRequest = (HttpContext context) => context.Request.Path.ToString().Contains("/api/");
app.UseWhen(context => !isApiRequest(context), appBuilder =>
{
     appBuilder.UseStatusCodePagesWithRedirects("~/Error/{0}");
});

我相信通过使用像 UseStatusCodePages() 或 UseStatusCodePagesWithRedirects() 这样的中间件,您实际上决定 return 一个包含错误代码(需要发送到浏览器)的正确 HTML 页面代码 200) 而不是 return 自身的代码。就安全性而言,它通常被认为是一种良好做法。你所经历的对我来说似乎合乎逻辑。也许,我不确定它对你的情况是否有帮助,你可以做的是将 UseStatusCodePagesWithRedirects() 的使用限制在所有控制器上,但 api 使用 UseWhen() 的控制器,这样任何错误的 URL 在这个特定的“/api/”控制器上仍然会 returns 404?或解析 angular 中的答案以检测是否发生任何错误。