【发布时间】: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<bool>,因为您将ObjectResult转换为使用其默认构造函数的ActionResult<bool>。 -
@HereticMonkey 在调试器视图中该对象实际上是一个 ObjectResult 实例,因为 ObjectResult 扩展了 ActionResult,无论哪种方式,如果我返回 ObjectResult,它的行为方式相同
标签: c# asp.net-core .net-core asp.net-core-mvc