Метод в контроллере останавливается на httpClient.SendAsyn c (запрос); ASP.NET - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь вызвать метод в контроллере с веб-страницы. Однако, когда код запускается, он прекращает выполнение в httpClient.SendAsyn c (запрос) ;. Никогда не выходит за рамки этого. Он отлично работает в консольном приложении. net, но не в веб-приложении ASP. NET.

Это мой метод:

public static async Task<Employee> LoadData(int ID)
{
    using (var httpClient = new HttpClient())
    {
        using (var request = new HttpRequestMessage(new HttpMethod("GET"), "https://api.example.net/api/GetData"))
        {

            request.Headers.TryAddWithoutValidation("Authorization", "Basic TOKEN HERE");
            var response = await httpClient.SendAsync(request);

            response.EnsureSuccessStatusCode();
            string responseBody = await response.Content.ReadAsStringAsync();
            JObject o = JObject.Parse(responseBody);
            JToken t = o.SelectToken("$.value[?(@.Id == " + "'" + ID + "'" + ")]");
            string a = t.ToString();
            Employee e = JsonConvert.DeserializeObject<Employee>(a);



            return e;
        }
    }
}

Это метод контроллера :

public JsonResult Test()
{
    try
    {
        Api.LoadData(507);

        return Json(true, JsonRequestBehavior.AllowGet);
    }
    catch (Exception ex)
    {
        return Json(false, JsonRequestBehavior.AllowGet);
    }
}

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 10 марта 2020

У вас есть 2 варианта здесь:

Использование Task.GetAwaiter() для ожидания LoadData завершено, а затем вернуть значение. ( Предупреждение : он вызывает асинхронный LoadData и блокируя его синхронно, чтобы он вообще не был асинхронным и мог также вызвать взаимные блокировки.)

public JsonResult Test()
{
    try
    {
        Api.LoadData(507).GetAwaiter().GetResult();

        return Json(true, JsonRequestBehavior.AllowGet);
    }
    catch (Exception ex)
    {
        return Json(false, JsonRequestBehavior.AllowGet);
    }
}

Или вы можете изменить метод Test() как async:

public async JsonResult Test()
{
    //...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...