首页 > 解决方案 > WepApi TaskCanceledException 任务被取消。httpClient

问题描述

它运行良好,但我在 api 中进行了一些更改,添加了更多控制器,然后它停止工作,总是抛出异常:GetAsync().result 行中的“TaskCanceledException:任务被取消” . 我增加超时并无限保持加载。向控制器 API 发出请求的代码控制器 APP:

  public ActionResult Login(LoginM us)
    {
        try
        {
            cuentaM account = new cuentaM();
            HttpClient client = new HttpClient();

            var result = client.GetAsync("http://localhost:26723/api/Login" + "?email=" + us.email + "&password=" + us.password).Result;
            if (result.IsSuccessStatusCode)
            {
                account = result.Content.ReadAsAsync<cuentaM>().Result;
            }

            Session["cuenta"] = account;
            return RedirectToAction("Index", "Home");
        }
        catch (Exception ex)
        {
            throw;

        }
    }

控制器 API 代码:

 public HttpResponseMessage Get(string email, string password)
    {
        try
        {
            using (elevationbEntities db = new elevationbEntities())
            {
                usuario user = db.usuarios.Where(m => m.email == email && m.password == password).SingleOrDefault();
                cuentaM account = new cuentaM();
                if (user != null)
                {
                    account = (from o in db.cuentas
                               join cu in db.cuentausuarios on o.idCuenta equals cu.idCuenta
                               join u in db.usuarios on cu.idUsuario equals u.idUsuario
                               where u.idUsuario == user.idUsuario
                               select new cuentaM {  idUsuario = user.idUsuario, idCuenta = o.idCuenta, CodigoUnico = o.CodigoUnico })
                               .FirstOrDefault();
                }
                else
                {
                    account.Error = "Wrong Password or Email";
                }

                HttpResponseMessage response;
                response = Request.CreateResponse(HttpStatusCode.OK, account);
                return response;
            }
        }
        catch (TaskCanceledException ex)
        {

            HttpResponseMessage response;
            response = Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex);
            return response;
        }

    }

标签: asp.net-mvcasp.net-web-api2dotnet-httpclient

解决方案


如本文所述,您可能会因阻塞异步调用而陷入死锁。这是有问题的行:

account = result.Content.ReadAsAsync<cuentaM>().Result;

将方法签名更改为Login

 public async Task<ActionResult> Login(LoginM us)

然后将有问题的行更改为使用await,而不是.Result

account = await result.Content.ReadAsAsync<cuentaM>();

推荐阅读