У меня был рабочий код, который возвращал что-то из моего CommonRestClient (это простая оболочка для HttpClient):
public async Task<IActionResult> Index()
{
var uri = _baseUri.Concat(AvalancheServiceAdresses.NodeService);
using (var client = new CommonRestClient(uri))
{
var result = await client.GetAsync<List<NodeInfoContract>>(new Uri(NodeServiceConstant.NodesContractUrl, UriKind.Relative), null);
return View(result);
}
}
Он работал нормально, и я был счастлив. Пока я не решу переместить свой код из представления в другой класс, который должен инкапсулировать всю логику REST и предоставлять ООП API.
Итак, теперь мой индекс выглядит так:
public async Task<IActionResult> Index()
{
var nodeInfoContracts = await _configManager.GetNodesList();
return View(nodeInfoContracts);
}
где GetNodesList
public ConfiguredTaskAwaitable<List<NodeInfoContract>> GetNodesList()
{
var uri = _baseUri.Concat(AvalancheServiceAdresses.NodeService);
using (var client = new CommonRestClient(uri))
{
return client.GetAsync<List<NodeInfoContract>>(new Uri(NodeServiceConstant.NodesContractUrl, UriKind.Relative), null);
}
}
Понятно, что предоставленные коды равны.
Но теперь он всегда выдает исключение, когда я пытаюсь получить результат. В моем методе GetAsync он терпит неудачу в следующей строке с TaskCanceledException:
var response = await _client.GetAsync(url).ConfigureAwait(false);
Но это интересно: когда я ставлю точку останова на эту строку и перешагиваю через нее, все работает нормально. Итак, здесь у нас есть состояние гонки или подобное.
Почему я получаю это? Я пытался поставить CondigureAwait false/true, комбинируя какой-то код, но он всегда выдает ошибку, когда точки останова отключены. Я проверил тайм-аут, который составляет несколько минут, это не может вызвать эту ошибку.
Viewвызывается до достижения конца оператораusingдляCommonRestClientи, таким образом, этот объектDisposed, тогда как во второй , мы знаем, что нас вызывают за пределами блокаusing. Как я уже сказал, здесь может и не быть разницы, но не ясно, что коды равны - person Damien_The_Unbeliever   schedule 31.05.2016client.GetAsync...? - person Leonid Malyshev   schedule 31.05.2016ObjectDisposedException, поэтому я не обнаружил, что контекст заканчивается до завершения запроса. Я согласен, что это моя вина, но, как я уже сказал, меня смутило описание исключенияResuest timeout. Это явно был не тайм-аут. - person Alex Zhukovskiy   schedule 31.05.2016GetNodesListне являетсяasyncметодом? Это могло бы быть примерно так же, если бы это былоasyncи оноawaited наclient.GetAsync, как в первой реализацииIndex, которую вы показываете. По сути, как вы показываете, вы избавляетесь от клиента до того, как он успевает завершить или даже начать общение. - person acelent   schedule 31.05.2016