【问题标题】:.Net Core ActionResult<bool> always returning false?.Net Core ActionResult<bool> 总是返回 false?
【发布时间】:2019-09-07 09:41:55
【问题描述】:

我正在创建一个 API 服务器,我正在使用一项服务来验证某些输入,它的方法返回 ActionResult,这样我就可以在值为 false 时返回 403/404/200 结果。当我的方法返回此值时,似乎 result.Value 始终为 false?

我试图简单地检查 ActionResult 是否为状态码 200 并跳过该部分,但似乎没有办法这样做(这似乎是正确的)

验证方法:

public async Task<ActionResult<bool>> CanUpdateUser(ClaimsPrincipal user, Organisation org, string userId)
{
    if (org == null)
        return StatusCode(404, ApiResponseConstants.OrganisationDoesntExist);

    if (!org.UserIsMember(user))
        return StatusCode(403, ApiResponseConstants.NotOrganisationMember);

    if (!org.UserHasPermission(user, OrganisationPermissions.EditOrgUsers))
        return StatusCode(403, ApiResponseConstants.NoPermission);

    ResponseUser responseUser = await GetResponseUserAsync(org, userId);
    if (responseUser == null)
        return StatusCode(404, ApiResponseConstants.UserDoesntExist);

    if (userId.Equals(org.Owner, StringComparison.OrdinalIgnoreCase))
        return StatusCode(403, "Organisation owners cannot be updated");

    string currentUserId = user.Claims.First(claim => claim.Type.Equals("sub")).Value;
    return userId.Equals(currentUserId, StringComparison.OrdinalIgnoreCase) ? StatusCode(403, "Organisation users cannot update themselves") : Ok(true);
}

private static OkObjectResult Ok(object value)
{
    return new OkObjectResult(value);
}

private static ObjectResult StatusCode(int statusCode, object value)
{
    return new ObjectResult(value)
    {
        StatusCode = statusCode
    };
}

使用验证方法的控制器方法:

public async Task<ActionResult<bool>> CanUpdateUser(string organisation, string user, bool respond200 = true)
{
    Organisation org = await _verificationService.VerifyOrganisation(organisation);
    ActionResult<bool> result = await _canUserService.CanUpdateUser(User, org, user);
    return respond200 ? Ok(result.Value) : result;
}

当我做Ok(true) 时,我希望result.Value == true 但这是错误的?如果我在 StatusCode 方法 ObjectResult.Value == true 中放置了一个调试器断点,那么这两种方法之间会发生一些奇怪的事情吗?

编辑:

请注意,我使用的是 .Net Core 2.2

【问题讨论】:

  • 您实际上获得了Value 属性的默认值ActionResult&lt;bool&gt;,因为您将ObjectResult 转换为使用其默认构造函数的ActionResult&lt;bool&gt;
  • @HereticMonkey 在调试器视图中该对象实际上是一个 ObjectResult 实例,因为 ObjectResult 扩展了 ActionResult,无论哪种方式,如果我返回 ObjectResult,它的行为方式相同

标签: c# asp.net-core .net-core asp.net-core-mvc


【解决方案1】:

我认为这行代码你的逻辑是错误的

 return userId.Equals(currentUserId, StringComparison.OrdinalIgnoreCase) ? StatusCode(403, "Organisation users cannot update themselves") : Ok(true);

试着改成这个看看是否有效

 return userId.Equals(currentUserId, StringComparison.OrdinalIgnoreCase) ? StatusCode(403, "Organisation users cannot update themselves") : true;

【讨论】:

  • 这非常有趣,有效,但是如果您能够回答,为什么 Ok(true) 不起作用,但是像 Ok(org) 这样的东西却可以(org 很简单具有字符串值等的对象)
  • 因为你使用的Ok()状态码响应只存在于控制器中
  • 抱歉,用我的 Ok() 方法的代码编辑了我的问题,它与基本控制器代码相同,但是它返回 false。
  • 是的,我觉得还可以
猜你喜欢
  • 2020-10-04
  • 2020-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-28
  • 2013-10-30
相关资源
最近更新 更多