【问题标题】:Wrong API url in ASP.NET CoreASP.NET Core 中的 API url 错误
【发布时间】:2017-02-02 14:52:20
【问题描述】:

我在 ASP.NET Core 应用程序中有如下 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 页面并返回 200 的状态代码。我将此 API 与 angular.js 一起使用。由于 API 在错误的 URL 上返回 404 页面,状态码为 200,因此永远不会调用 $httpthen 方法的错误函数,并且在 response.data 中我得到了 404 页面的 HTML。如何在调用错误的 API URL 时返回 404 状态码,并在调用错误的 NON API URL 时返回正常的 404 页面? 下面是我调用错误 API URL 时得到的屏幕截图。

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

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

【问题讨论】:

    标签: asp.net-core asp.net-core-mvc asp.net-core-1.0


    【解决方案1】:

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

    【讨论】:

    • 我是 angular.js 的新手,所以我不能在 javascript 方面做太多事情。在 ASP.NET 方面,我应该使用哪种中间件来排除 API 控制器使用 StatusCodePages?当我将Authorize 属性添加到 API 控制器时,也会发生此问题。当我尝试在不登录的情况下访问 API 时添加 Authorize 属性后,它返回带有 200 状态码的登录页面。因此,我不得不删除 Authorize 属性。
    • UseWhen() 可以完成这项工作。例如,您可以在此处找到示例:stackoverflow.com/questions/37841270/… 将 UseWhen() 与 URL context.Request.Path.StartsWithSegments("/API/") 上的条件结合使用
    • 在你的 Update1 版本中 app.UseWhen(context =&gt; !isApiRequest(context), appBuilder =&gt; { app.UseStatusCodePagesWithRedirects("~/Error/{0}"); }); 应该是 app.UseWhen(context =&gt; !isApiRequest(context), appBuilder =&gt; { appBuilder.UseStatusCodePagesWithRedirects("~/Error/{0}"); }); 为 appbuilder 切换应用程序。
    • 不用担心,事实上,在互联网上你有很多关于 UseWhen 的教程,在应用程序和应用程序构建器之间存在完全相同的混淆,我遇到了这个问题。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    • 2021-06-24
    • 2019-06-25
    • 2019-11-04
    • 2017-04-22
    • 2019-04-10
    相关资源
    最近更新 更多