Здравствуйте, e.thrash, Вы писали:
ET>Есть такой код, но почему-то зависает запрос на PostAsync. ET>Ни ошибки, ни результата. В фидлере тоже запроса не видно
ET> var body = "userId=5";
json не валидный.
ET> .PostAsync(url, new StringContent(body, Encoding.UTF8, "application/json"))
ET>>.net core 3.1 ET>>не знаю насколько это влияет что вызов этого метода сервиса идет из юнит теста
vaa>Без этого .ConfigureAwait(false); пробовали?
vaa>в консольном приложении код работает без проблем.
Здравствуйте, 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);
Здравствуйте, 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();
}
но вот почему изначальный код (если отбросить джсон формат) висел и не ошибку не давал и не отрабатывал — загадка.
причем я могу списать на дедлок. Но мне казалось современые фреймворки обнаруживают дедлоки и кидают тоже ошибку
ET>>да, вначале без него пробовал. тут ET>>начитал vaa>Читал есть нюанс, что все await в цепочке должны быть .ConfigureAwait(false) не помню только внутри Post или в вашем методе. vaa>попробуйте добавить ко всем
vaa> var result = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
весело. особенно если цепочка вызовов большая. ненадежно это как-то. сделали бы эксепшн тогда
Здравствуйте, 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 . . .
Здравствуйте, 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.
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, e.thrash, Вы писали:
ET>>>>Что тут не так?
G>>>Вызывается как?
ET>>Что имеешь ввиду как? конкретно тут напоролся при вызове юнит теста
G>Как вызывается данная функция? Если вызывающий код вызывает .Result\.Wait(), то легко создать дедлок.
G>проблема у вас не в обозначенном коде, а в способе его вызова.
странно, откатился к максимально ранней версии но изначальный код отрабатывает и возвращает 200.
Ощущение что в удаленном сервере была проблема может.
а в PostAsync нет таймаута на ответ? может удаленный сервис подвис и мой тупо ждал пока прочухается
Здравствуйте, e.thrash, Вы писали:
ET>Здравствуйте, gandjustas, Вы писали:
G>>Здравствуйте, e.thrash, Вы писали:
ET>>>>>Что тут не так?
G>>>>Вызывается как?
ET>>>Что имеешь ввиду как? конкретно тут напоролся при вызове юнит теста
G>>Как вызывается данная функция? Если вызывающий код вызывает .Result\.Wait(), то легко создать дедлок.
G>>проблема у вас не в обозначенном коде, а в способе его вызова.
ET>странно, откатился к максимально ранней версии но изначальный код отрабатывает и возвращает 200. ET>Ощущение что в удаленном сервере была проблема может. ET>а в PostAsync нет таймаута на ответ? может удаленный сервис подвис и мой тупо ждал пока прочухается
проверить же легко измените урл. и вообще переходите на 6.0.
Здравствуйте, e.thrash, Вы писали:
ET> а и вопрос, а фреймворк дедлоки разве не умеет обнаруживать и кидать свою ошибку?
Нет. По идее нужно к каждому потоку привязывать предыдущие освобожденные (удерживаемые) WaitHandle и каждому WaitHandle привязывать поток который всех тормозит и те которые ждут.
При ожидании больше какого то времени можно проанализировать кто кого блокирует
и солнце б утром не вставало, когда бы не было меня