Проблема с HttpClient.PostAsJsonAsyn c Не работает из ASPX - PullRequest
1 голос
/ 06 февраля 2020

Я создал службу ASP. NET Core 2.1 и могу нормально вызывать ее из консольного приложения. Однако, когда я использую тот же код для вызова его со страницы ASPX, он не возвращает ответ. Он просто не проходит мимо _client.PostAsJsonAsyn c и, кажется, работает вечно. * * * * * * * * * * * - то, что через эту строку займет всего несколько секунд. Есть идеи о том, что мне не хватает?

List<OutputAddress> outputAddresses = RunAsync(inputAddresses).GetAwaiter().GetResult();

static async Task<List<OutputAddress>> RunAsync(List<InputAddress> addresses)
{
    // Update port # in the following line.
    _client.BaseAddress = new Uri("http://<servername>/GeocodeAPI/");
    _client.DefaultRequestHeaders.Accept.Clear();
    _client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    _client.Timeout = new TimeSpan(0, 10, 0);

    try
    {
        HttpResponseMessage response = await _client.PostAsJsonAsync("api/Geocode/Addresses", addresses);
        if (response.IsSuccessStatusCode)
        {
            var result = response.Content.ReadAsStringAsync().Result;
            return JsonConvert.DeserializeObject<List<OutputAddress>>(result);
        }
        else
            return null;

    }
    catch (Exception e)
    {
        return null;
    }
}

============================

Огромное спасибо Нкоси за их ответ. Вот что мне пришлось изменить:

Вызов функции ASP. NET Базовая служба

        static async Task<List<OutputAddress>> RunAsync(List<InputAddress> addresses)
        {
            _client.BaseAddress = new Uri("http://<servername>/GeocodeAPI/");
            _client.DefaultRequestHeaders.Accept.Clear();
            _client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            _client.Timeout = new TimeSpan(0, 10, 0);

            try
            {
                HttpResponseMessage response = await _client.PostAsJsonAsync("api/Geocode/Addresses", addresses);
                if (response.IsSuccessStatusCode)
                {
                    var result = await response.Content.ReadAsStringAsync();
                    return JsonConvert.DeserializeObject<List<OutputAddress>>(result);
                }
                else
                    return null;

            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                return null;
            }
        }

Функция, вызывающая вышеуказанную функцию (RunAsyn c): добавлена ​​asyn c Ключевое слово

private async void ReadCsvFile(string filepath)
{
    ...
    List<OutputAddress> outputAddresses = await RunAsync(inputAddresses);
    ...
}

Добавлено Async = "true" в код aspx:

<%@ Page ... Async="true" %>

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

Остерегайтесь того, как вы используете асинхронный код в ASP. NET Веб-формах.

Вам необходимо использовать page asyn c tasks .

Как говорится, ничто в asyn c не меняет протокол HTTP, и, если вам нужно какое-то поведение на стороне клиента, вам нужно реализовать его на клиенте, как показало Anu .

0 голосов
/ 06 февраля 2020

Смешивание asyn c -wait и блокировка вызовов, таких как .Result;, могут привести к взаимоблокировкам

, ожидающих вызовов для получения контента

var result = await response.Content.ReadAsStringAsync();

Также, при использовании asyn c -Await, go Asyn c полностью.

List<OutputAddress> outputAddresses = await RunAsync(inputAddresses);

Справочник Async / Await - Лучшие практики в асинхронном программировании

...