HttpClient IsComplete 总是返回 false

Posted

技术标签:

【中文标题】HttpClient IsComplete 总是返回 false【英文标题】:HttpClient IsComplete always return false 【发布时间】:2015-02-16 11:18:09 【问题描述】:

我正在尝试授权用户使用 HttpClient GetAsync 方法从远程 xml Web 服务获取数据。不幸的是,无论服务器回答结果如何。IsCompleted 总是在 Controller 中返回 false。我做错了什么? 这是控制器:

[HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public ActionResult Login(CredentialsViewModel model)
        
            if (!ModelState.IsValid) return View("Login");
            var result = ar.AuthenticateUser(model.UserName, model.Password);
            if (!result.IsCompleted)
            
                ModelState.AddModelError("CustomError", "Вход в систему с указанными логином и паролем невозможен");
                return View("Login");
            
            FormsAuthentication.SetAuthCookie(model.UserName, false);
            return RedirectToAction("Index", "Home");
        

如果授权成功,这是实际上必须返回布尔值的存储库。

public async Task<bool> AuthenticateUser(string login, string password)
        
            const string url = @"http://somehost.ru:5555/api/getcountries";
            var client = new HttpClient();
            var encoded = Convert.ToBase64String(Encoding.ASCII.GetBytes(String.Format("0:1", login, password)));
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", encoded);
            var result = await client.GetAsync(url);
            if (result.IsSuccessStatusCode) return true;
            return false;
        

【问题讨论】:

您可以使用像 Fiddler 这样的 HTTP 调试器来查看请求/响应吗?它只是挂在“等待”吗? 【参考方案1】:

您的控制器操作需要返回一个任务,因为所有异步方法都需要被链接起来。

Turtles all the way down 帮助我记住:)

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(CredentialsViewModel model)

    if (!ModelState.IsValid) return View("Login");
    var result = await ar.AuthenticateUser(model.UserName, model.Password);
    if (!result.IsCompleted)
    
        ModelState.AddModelError("CustomError", "Вход в систему с указанными логином и паролем невозможен");
        return View("Login");
    
    FormsAuthentication.SetAuthCookie(model.UserName, false);
    return RedirectToAction("Index", "Home");

【讨论】:

以上是关于HttpClient IsComplete 总是返回 false的主要内容,如果未能解决你的问题,请参考以下文章

pushsharp broker 的 iscomplete 属性的目的是啥?

如何 var isComplete = false;下面的功能有效吗?

为啥 C# HttpClient 不能调用这个 URL(总是超时)?

java 练习递归isHeap isComplete isBST

apache的HttpClient 执行总是异常,求助

Windows.Web.Http.HttpClient.GetStringAsync 总是返回相同的结果