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,$http
的 then
方法的错误函数永远不会被调用并且在 response.data
我得到了 404 页面的 HTML。如何在错误的 API URL 被调用时 return 404 的状态码,以及在错误的 NON API URL 被调用时 return 正常的 404 页面?
下面是我调用错误 API URL 时得到的屏幕截图。
基于@Daboul 对 this link 的建议和解决方案
在 startup.cs
的 configure
方法中添加以下部分有效。
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 中的答案以检测是否发生任何错误。
我在 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,$http
的 then
方法的错误函数永远不会被调用并且在 response.data
我得到了 404 页面的 HTML。如何在错误的 API URL 被调用时 return 404 的状态码,以及在错误的 NON API URL 被调用时 return 正常的 404 页面?
下面是我调用错误 API URL 时得到的屏幕截图。
基于@Daboul 对 this link 的建议和解决方案
在 startup.cs
的 configure
方法中添加以下部分有效。
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 中的答案以检测是否发生任何错误。