代码之家  ›  专栏  ›  技术社区  ›  bilpor

非异步调用异步方法时出错

  •  1
  • bilpor  · 技术社区  · 6 年前

    我有以下异步方法:

    [HttpGet]
    [Route("api/SecurityRoles/AllowDeleteRole/{securityRoleId}")]
    public async Task<IHttpActionResult> AllowDeleteRole(int securityRoleId)
    {
        _systemLogger.LogInfo($"Method api/SecurityRoles/AllowDeleteRole (Get) called with securityRoleId: {securityRoleId}");
    
        var securityRolePermission =
                await _securityRolePermissionService.SecurityRolePermissionsCountBySecurityRoleId(securityRoleId);
        if (securityRolePermission != SecurityRoleDeleteResult.Success) return Ok(SecurityRoleDeleteResult.RolePermissionExists);
    
        var securityRolePageEntity =
                await  _securityRolePageEntityService.SecurityRolePageEntityCountBySecurityRoleId(securityRoleId);
        return Ok(securityRolePageEntity != SecurityRoleDeleteResult.Success ? SecurityRoleDeleteResult.RolePageEntityExists : SecurityRoleDeleteResult.Success);
        }
    

    它可以在许多地方使用,但在这个例子中,我需要非异步地使用它,所以我有以下代码首先对其进行包装:

    public async Task<SecurityRoleDeleteResult> AllowDeleteRole(int securityRoleId)
        {
            string url = $"{_housingDataSecurityConfiguration.HousingDataSecurityWebApiUrl}SecurityRoles/AllowDeleteRole/{securityRoleId}";
            var message =  _apiClientService.Retrieve<HttpResponseMessage>(url);
    
            if (message.StatusCode == HttpStatusCode.InternalServerError)
            {
                return SecurityRoleDeleteResult.ErrorOccurred;
            }
    
            int intResult = 0;
            var apiResult = await message.Content.ReadAsStringAsync();
            if (int.TryParse(apiResult, out intResult))
            {
                return (SecurityRoleDeleteResult)intResult;
            }
            else
            {
                return SecurityRoleDeleteResult.ErrorOccurred;
            }
        }
    

    在接到电话之前:

    public  SecurityRoleViewModel BuildViewModelForEdit(int id)
    {
    
        var enableButton = false;
        _securityRoleService.AllowDeleteRole(id).ContinueWith(result =>
            {
                enableButton = (result.Result == SecurityRoleDeleteResult.Success) ? true : false;
    
        });
    
        SecurityRoleViewModel model = new SecurityRoleViewModel()
        {
            SecurityRole = _securityRoleService.SecurityRoleRetrieve(id),
            RolePermissions = _securityRoleService.SecurityRolePermissionsRetrieve(id),
            EnableDeleteButton = enableButton 
        };
        return model;
    }
    

    我的问题是当我试图设置 EnableDeleteButton = enableButton 在模型中,它将在行上引发以下错误:

    enableButton = (result.Result == SecurityRoleDeleteResult.Success) ? true : false;
    

    “将值3转换为类型”System.net.http.httpResponseMessage“时出错。”路径“”,第1行,位置1。“

    3指的是我的SecurityRoleDeleteResult枚举中的一个枚举值。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Dave    6 年前

    AllowDeleteRole 返回 HttpResponseMessage . 这个 result 传入lambda的对象属于类型 Task<IHttpActionResult> . 所以当你这样做的时候 result.Result 您现在使用的对象 IHttpActionResult 更具体地说是 HTT响应消息 它出现了。

    这就是你问题的原因