HttpClient IsComplete всегда возвращает false

Я пытаюсь авторизовать пользователя для получения данных из удаленной веб-службы xml с помощью метода HttpClient GetAsync. К сожалению, независимо от результата ответа сервера. IsCompleted всегда возвращает 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;
        }

person andrey.shedko    schedule 16.02.2015    source источник
comment
Можете ли вы использовать отладчик HTTP, такой как Fiddler, для просмотра запроса/ответа? Он просто висит на «ожидании»?   -  person Jeremy    schedule 16.02.2015


Ответы (1)


Ваше действие контроллера должно возвращать задачу, так как все асинхронные методы должны быть связаны.

Черепахи внизу помогают мне вспомнить :)

[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");
}
person hutchonoid    schedule 16.02.2015