PostAsync
От: e.thrash  
Дата: 02.04.22 11:27
Оценка:
Есть такой код, но почему-то зависает запрос на PostAsync.
Ни ошибки, ни результата. В фидлере тоже запроса не видно

В постмане результат возвращается.
Что тут не так?

   private async Task<string> Get()
        {
           
            using (var client = new HttpClient())
            {
                var url = "http://www.com";
                var body = "userId=5";

                try
                {
                    var response = await client
                        .PostAsync(url, new StringContent(body, Encoding.UTF8, "application/json"))
                        .ConfigureAwait(false);
                    var result = await response.Content.ReadAsStringAsync();
                    return result;
                }
                catch (Exception e)
                {
                    throw e;
                }
            
            }  
        }
Re: PostAsync
От: vaa https://www.youtube.com/playlist?list=PLtrvASfI1KW7VOYRKjglcagQzWLoxlncl
Дата: 02.04.22 12:40
Оценка:
Здравствуйте, e.thrash, Вы писали:

ET>Есть такой код, но почему-то зависает запрос на PostAsync.

ET>Ни ошибки, ни результата. В фидлере тоже запроса не видно




ET> var body = "userId=5";


json не валидный.

ET> .PostAsync(url, new StringContent(body, Encoding.UTF8, "application/json"))


попробуйте PostAsync().Result без await.
Re[2]: PostAsync
От: e.thrash  
Дата: 02.04.22 13:56
Оценка:
Здравствуйте, vaa, Вы писали:


ET>> .PostAsync(url, new StringContent(body, Encoding.UTF8, "application/json"))


vaa>попробуйте PostAsync().Result без await.



помогло. Спасибо

а почему висит и не ошибки и ничего в ответ?
Re[3]: PostAsync
От: vaa https://www.youtube.com/playlist?list=PLtrvASfI1KW7VOYRKjglcagQzWLoxlncl
Дата: 02.04.22 14:52
Оценка:
Здравствуйте, e.thrash, Вы писали:

ET>Здравствуйте, vaa, Вы писали:



ET>>> .PostAsync(url, new StringContent(body, Encoding.UTF8, "application/json"))


vaa>>попробуйте PostAsync().Result без await.



ET>помогло. Спасибо


ET>а почему висит и не ошибки и ничего в ответ?


возможно что-то блокируется контекстом. UI или Asp.Net. FW какой?
Re[3]: PostAsync
От: vaa https://www.youtube.com/playlist?list=PLtrvASfI1KW7VOYRKjglcagQzWLoxlncl
Дата: 02.04.22 14:57
Оценка:
Здравствуйте, e.thrash, Вы писали:


ET>а почему висит и не ошибки и ничего в ответ?


https://hamidmosalla.com/2018/06/24/what-is-synchronizationcontext/
Re[4]: PostAsync
От: e.thrash  
Дата: 02.04.22 15:01
Оценка:
Здравствуйте, vaa, Вы писали:

vaa>Здравствуйте, e.thrash, Вы писали:


ET>>Здравствуйте, vaa, Вы писали:



ET>>>> .PostAsync(url, new StringContent(body, Encoding.UTF8, "application/json"))


vaa>>>попробуйте PostAsync().Result без await.



ET>>помогло. Спасибо


ET>>а почему висит и не ошибки и ничего в ответ?


vaa>возможно что-то блокируется контекстом. UI или Asp.Net. FW какой?



.net core 3.1
не знаю насколько это влияет что вызов этого метода сервиса идет из юнит теста
Re[5]: PostAsync
От: vaa https://www.youtube.com/playlist?list=PLtrvASfI1KW7VOYRKjglcagQzWLoxlncl
Дата: 02.04.22 15:16
Оценка:
Здравствуйте, e.thrash, Вы писали:

ET>Здравствуйте, vaa, Вы писали:


vaa>>Здравствуйте, e.thrash, Вы писали:


ET>>>Здравствуйте, vaa, Вы писали:



ET>>>>> .PostAsync(url, new StringContent(body, Encoding.UTF8, "application/json"))


vaa>>>>попробуйте PostAsync().Result без await.



ET>>>помогло. Спасибо


ET>>>а почему висит и не ошибки и ничего в ответ?


vaa>>возможно что-то блокируется контекстом. UI или Asp.Net. FW какой?



ET>.net core 3.1

ET>не знаю насколько это влияет что вызов этого метода сервиса идет из юнит теста

Без этого .ConfigureAwait(false); пробовали?

в консольном приложении код работает без проблем.
Re[6]: PostAsync
От: e.thrash  
Дата: 02.04.22 15:43
Оценка:
Здравствуйте, vaa, Вы писали:




ET>>.net core 3.1

ET>>не знаю насколько это влияет что вызов этого метода сервиса идет из юнит теста

vaa>Без этого .ConfigureAwait(false); пробовали?


vaa>в консольном приложении код работает без проблем.


да, вначале без него пробовал. тут
начитал
Re[7]: PostAsync
От: vaa https://www.youtube.com/playlist?list=PLtrvASfI1KW7VOYRKjglcagQzWLoxlncl
Дата: 02.04.22 16:57
Оценка:
Здравствуйте, e.thrash, Вы писали:

ET>Здравствуйте, vaa, Вы писали:





ET>>>.net core 3.1

ET>>>не знаю насколько это влияет что вызов этого метода сервиса идет из юнит теста

vaa>>Без этого .ConfigureAwait(false); пробовали?


vaa>>в консольном приложении код работает без проблем.


ET>да, вначале без него пробовал. тут

ET>начитал
Читал есть нюанс, что все await в цепочке должны быть .ConfigureAwait(false) не помню только внутри Post или в вашем методе.
попробуйте добавить ко всем

var result = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
Re: PostAsync
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 02.04.22 23:13
Оценка: +1
Здравствуйте, e.thrash, Вы писали:


ET>Что тут не так?


Вызывается как?
Re[2]: PostAsync
От: e.thrash  
Дата: 03.04.22 09:44
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Здравствуйте, e.thrash, Вы писали:




ET>>Что тут не так?


G>Вызывается как?


Что имеешь ввиду как? конкретно тут напоролся при вызове юнит теста

вот в итоге рабочий код

   using (var client = new HttpClient())
            {
                var url = "http://www.dddd.com";
                var body = "user=3";

                var response = client.PostAsync(url, new StringContent(body, Encoding.UTF8, "text/plain"))
                    .Result;
                var jsonString = await response.Content.ReadAsStringAsync();               
            }


но вот почему изначальный код (если отбросить джсон формат) висел и не ошибку не давал и не отрабатывал — загадка.
причем я могу списать на дедлок. Но мне казалось современые фреймворки обнаруживают дедлоки и кидают тоже ошибку
Re[8]: PostAsync
От: e.thrash  
Дата: 03.04.22 09:46
Оценка:
Здравствуйте, vaa, Вы писали:


ET>>да, вначале без него пробовал. тут

ET>>начитал
vaa>Читал есть нюанс, что все await в цепочке должны быть .ConfigureAwait(false) не помню только внутри Post или в вашем методе.
vaa>попробуйте добавить ко всем

vaa> var result = await response.Content.ReadAsStringAsync().ConfigureAwait(false);




весело. особенно если цепочка вызовов большая. ненадежно это как-то. сделали бы эксепшн тогда
Re: PostAsync
От: _NN_ www.nemerleweb.com
Дата: 03.04.22 11:02
Оценка:
Здравствуйте, e.thrash, Вы писали:

ET>В постмане результат возвращается.

ET>Что тут не так?
Всё так.
Скомпилировал и запустил ваш код, работает без проблем.
Проблема у вас в другом месте.

Пару замечаний:

using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

async Task<string> GetAsync() // Асинхронные методы принято заканчивать "Async"
{

    using (var client = new HttpClient())
    {
        var url = "http://www.com";
        var body = "userId=5";

        try
        {
            var response = await client
                .PostAsync(url, new StringContent(body, Encoding.UTF8, "application/json"))
                .ConfigureAwait(false);
            var result = await response.Content.ReadAsStringAsync();
            return result;
        }
        catch (Exception e)
        {
            throw; // Не надо явного "throw e" без необходимости. Так мы теряем полный стек исключения
        }
    }
}

var x = await GetAsync();
Console.WriteLine(x);


Результат

<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>openresty/1.13.6.1</center>
</body>
</html>


ConsoleApp1\bin\Debug\net6.0\ConsoleApp1.exe (process 41688) exited with code 0.
Press any key to close this window . . .

http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: PostAsync
От: BlackEric http://black-eric.lj.ru
Дата: 03.04.22 12:22
Оценка:
Здравствуйте, e.thrash, Вы писали:

ET>вот в итоге рабочий код

ET>

ET>   using (var client = new HttpClient())
ET>            {
ET>                var url = "http://www.dddd.com";
ET>                var body = "user=3";

ET>                var response = client.PostAsync(url, new StringContent(body, Encoding.UTF8, "text/plain"))
ET>                    .Result;
ET>                var jsonString = await response.Content.ReadAsStringAsync();               
ET>            }



Result блокирует поток исполнения. Под нагрузкой такое нормально не работает. Нужно искать почему не работает вызов с await.
https://github.com/BlackEric001
Re[3]: PostAsync
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 03.04.22 13:15
Оценка: +1
Здравствуйте, e.thrash, Вы писали:

ET>>>Что тут не так?


G>>Вызывается как?


ET>Что имеешь ввиду как? конкретно тут напоролся при вызове юнит теста


Как вызывается данная функция? Если вызывающий код вызывает .Result\.Wait(), то легко создать дедлок.

проблема у вас не в обозначенном коде, а в способе его вызова.
Re[2]: PostAsync
От: vaa https://www.youtube.com/playlist?list=PLtrvASfI1KW7VOYRKjglcagQzWLoxlncl
Дата: 04.04.22 11:39
Оценка:
Здравствуйте, _NN_, Вы писали:


_NN> \net6.0\ConsoleApp1.exe


может ошибка в 3.1?
Re[4]: PostAsync
От: e.thrash  
Дата: 04.04.22 11:41
Оценка: :)
Здравствуйте, gandjustas, Вы писали:

G>Здравствуйте, e.thrash, Вы писали:


ET>>>>Что тут не так?


G>>>Вызывается как?


ET>>Что имеешь ввиду как? конкретно тут напоролся при вызове юнит теста


G>Как вызывается данная функция? Если вызывающий код вызывает .Result\.Wait(), то легко создать дедлок.


G>проблема у вас не в обозначенном коде, а в способе его вызова.


странно, откатился к максимально ранней версии но изначальный код отрабатывает и возвращает 200.
Ощущение что в удаленном сервере была проблема может.
а в PostAsync нет таймаута на ответ? может удаленный сервис подвис и мой тупо ждал пока прочухается
Re[4]: PostAsync
От: e.thrash  
Дата: 04.04.22 11:42
Оценка:
Здравствуйте, gandjustas, Вы писали:


G>Как вызывается данная функция? Если вызывающий код вызывает .Result\.Wait(), то легко создать дедлок.


а и вопрос, а фреймворк дедлоки разве не умеет обнаруживать и кидать свою ошибку?
Re[5]: PostAsync
От: vaa https://www.youtube.com/playlist?list=PLtrvASfI1KW7VOYRKjglcagQzWLoxlncl
Дата: 04.04.22 11:48
Оценка:
Здравствуйте, e.thrash, Вы писали:

ET>Здравствуйте, gandjustas, Вы писали:


G>>Здравствуйте, e.thrash, Вы писали:


ET>>>>>Что тут не так?


G>>>>Вызывается как?


ET>>>Что имеешь ввиду как? конкретно тут напоролся при вызове юнит теста


G>>Как вызывается данная функция? Если вызывающий код вызывает .Result\.Wait(), то легко создать дедлок.


G>>проблема у вас не в обозначенном коде, а в способе его вызова.


ET>странно, откатился к максимально ранней версии но изначальный код отрабатывает и возвращает 200.

ET>Ощущение что в удаленном сервере была проблема может.
ET>а в PostAsync нет таймаута на ответ? может удаленный сервис подвис и мой тупо ждал пока прочухается

проверить же легко измените урл. и вообще переходите на 6.0.
Re[5]: PostAsync
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 04.04.22 12:48
Оценка:
Здравствуйте, e.thrash, Вы писали:

ET> а и вопрос, а фреймворк дедлоки разве не умеет обнаруживать и кидать свою ошибку?

Нет. По идее нужно к каждому потоку привязывать предыдущие освобожденные (удерживаемые) WaitHandle и каждому WaitHandle привязывать поток который всех тормозит и те которые ждут.
При ожидании больше какого то времени можно проанализировать кто кого блокирует
и солнце б утром не вставало, когда бы не было меня
Отредактировано 04.04.2022 12:59 Serginio1 . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.