protected virtual void OnCallPerformed(VkApiResponseInfo e) { CallPerformed?.Invoke(this, e); var key = e.Uri.ToString(); _responseCache.TryAdd(key, e); _tooMuchRequestsOccurrences = 0; _timeoutRetry = 0; }
private async Task <string> callAsync(Uri uri, CancellationToken ct) { try { var uriWithoutToken = removeQueryStringByKey(uri, "access_token"); logger.Debug($"GET {uriWithoutToken}"); var response = await _httpClient.GetAsync(uri, ct).ConfigureAwait(false); logger.Trace($"Ответ получен."); response.EnsureSuccessStatusCode(); var result = await response.Content.ReadAsStringAsync().ConfigureAwait(false); checkForErrors(result); var vkResponse = new VkApiResponseInfo(result, DateTimeOffset.Now) { Uri = uri }; logger.Trace($"Ответ успешно получен и сериализован."); OnCallPerformed(vkResponse); return(result); } catch (HttpRequestException ex) { logger.Error(ex, $"Соединение не удалось. Возможны проблемы с прокси сервером, либо сервер не отвечает."); throw new VkException($"Соеденение не удалось.\nПроверьте настройки прокси сервера и перезапустите приложение.\n{ex.Message}", ex); } catch (WebException ex) { logger.Error(ex, "Получено исключение WebException. Trying to handle it."); if (tryToHandleException(ex) == false) { logger.Error(ex, "Attempt to handle exception fails. Rethrowing"); throw; } } catch (VkException ex) { logger.Debug(ex, "Поймано исключение VkException. Возможно превышено ограничение на количество запросов в секунду, капча или что то еще."); if (_tooMuchRequestsOccurrences > 2) { logger.Error(ex, "Количество попыток на повтор запроса иссекли, слишком много запросов в секунду."); throw; } _tooMuchRequestsOccurrences++; //too much requests per second if (ex.ErrorCode == 6) { logger.Debug(ex, $"Слишком много запросов в секунду. После небольшой задержки запрос будет повторен."); await Task.Delay(TimeSpan.FromSeconds(1f), ct); if (!ct.IsCancellationRequested) { return(await callAsync(uri, ct)); } } throw; } // Httpclient timeout catch (TaskCanceledException ex) { logger.Error(ex, $"Превышен таймаут ожидания ответа, либо операция была отменена."); if (ct.IsCancellationRequested) { throw; } if (_timeoutRetry > 1) { logger.Error(ex, $"Соединение не удалось. Вызванный url - {uri}"); throw new VkException($"Соеденение не удалось.\nПроверьте настройки прокси сервера и перезапустите приложение.\n{ex.Message}", ex); } _timeoutRetry++; return(await callAsync(uri, ct).ConfigureAwait(false)); } //catch (VkException ex) { // //captcha needed // if (ex.ErrorCode == 14) { // // do captcha // doCaptcha(parameters, result); // await ExecuteMethodAsync(method, parameters); // } //} return(string.Empty); }