首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >WepApi TaskCanceledException A任务已取消。httpClient

WepApi TaskCanceledException A任务已取消。httpClient
EN

Stack Overflow用户
提问于 2018-08-23 04:02:31
回答 2查看 1.5K关注 0票数 1

它工作得很好,但我在应用程序接口中做了一些更改,添加了更多的控制器,没有任何异常,然后它停止工作,总是在GetAsync().result行中抛出异常:"TaskCanceledException:一个任务被取消“。我增加了超时时间,并且无限地保持加载。向控制器API发出请求的代码控制器应用程序:

代码语言:javascript
复制
  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代码:

代码语言:javascript
复制
 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;
        }

    }
EN

回答 2

Stack Overflow用户

发布于 2018-08-23 10:01:01

HttpClinet的异步API上进行阻塞调用(.Result)可能会导致死锁,特别是在使用MVC时,当进行阻塞调用时,可能会调用异步操作。

让代码一直保持同步。

同时,尽量避免在每次请求时都创建HttpClient实例。这可能会导致套接字耗尽。

代码语言:javascript
复制
private static HttpClient client = new HttpClient();

public async Task<ActionResult> Login(LoginM us) {
    try {
        cuentaM account = new cuentaM();
        var url = "http://localhost:26723/api/Login" + "?email=" + us.email + "&password=" + us.password
        var result = await client.GetAsync(url);
        if (result.IsSuccessStatusCode) {
            account = await result.Content.ReadAsAsync<cuentaM>();
        }

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

Stack Overflow用户

发布于 2018-08-23 10:01:17

您可能会因为阻塞异步调用而死锁,如this article中所述。下面是有问题的一行:

代码语言:javascript
复制
account = result.Content.ReadAsAsync<cuentaM>().Result;

Login的方法签名更改为:

代码语言:javascript
复制
 public async Task<ActionResult> Login(LoginM us)

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

代码语言:javascript
复制
account = await result.Content.ReadAsAsync<cuentaM>();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51974295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档