Отладка проекта WebApi Core висит на клиенте await. GetAsync - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть решение с 2 проектами: Asp.Net WebApi Core и WinForms.Я собираюсь использовать сервисы из WinForm.

Изменены свойства решения для запуска нескольких проектов: сначала WebApi, затем WinForm (основная форма - FORM1).

Теперь у меня есть простой код, подобный приведенному ниже:

private void button1_Click(object sender, EventArgs e)
{
    TestAutentication().Wait();
    Console.ReadKey();
}

static async Task TestAutentication()
{
    HttpClientHandler handler = new HttpClientHandler();
    handler.UseDefaultCredentials = true;
    using (var client = new HttpClient(handler))
    {

        client.BaseAddress = new Uri("http://localhost:53791");

        try
        {
            HttpResponseMessage response = await client.GetAsync("api/ValuesController");
            if (response.IsSuccessStatusCode)
            {
                var result = await response.Content.ReadAsAsync<string>();
                Console.WriteLine("{0}", result);
            }
            else
            {
                Console.WriteLine("{0}", response.ReasonPhrase);
            }

        }
        catch (HttpRequestException ex)
        {
            Console.WriteLine("{0}", ex.Message);
        }

    }
}

Во время запуска открывается браузер и затем FORM1.Нажатие на отладчик button1 зависает при выполнении строки:

HttpResponseMessage response = await client.GetAsync ("api / ValuesController");

В чем может быть причинависит?

Заранее спасибо.

1 Ответ

0 голосов
/ 11 декабря 2018

Вы блокируете свой главный поток, вызывая .Wait() для задачи.Вам нужно дождаться выполнения задачи до конца стека следующим образом:

private async void button1_Click(object sender, EventArgs e)
{
    await TestAutentication();
    Console.ReadKey();
}

Что касается примечания async void, они обычно являются запахом кода и их следует избегать, но при использовании для обработчика событий этоок.

Ссылка: Стоит ли избегать обработчиков событий 'async void'?

...