示例#1
0
        protected virtual void OnCallPerformed(VkApiResponseInfo e)
        {
            CallPerformed?.Invoke(this, e);

            var key = e.Uri.ToString();

            _responseCache.TryAdd(key, e);

            _tooMuchRequestsOccurrences = 0;
            _timeoutRetry = 0;
        }
示例#2
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);
        }