/// <summary> /// Выполнить запрос к LongPoll серверу ВКонтакте /// </summary> /// <param name="data">Данные для подключения.</param> private async Task <VKLongPollResponse> GetResponse(VKLongPollServerData data) { using (var client = new HttpClient()) { byte currentRetry = 0; while (currentRetry < MAX_RETRIES_NUMBER) { HttpResponseMessage response = null; try { response = await client.GetAsync(new Uri(String.Format( LONGPOLL_CONNECTION_MASK, data.Server, data.Key, data.Ts, LONGPOLL_WAIT, LONGPOLL_MODE))).AsTask(cts.Token); } catch (OperationCanceledException) { throw; } catch (Exception) { if (++currentRetry < MAX_RETRIES_NUMBER) { int timeout = currentRetry * 5; SendConnectionErrorPush(timeout); await Task.Delay(timeout * 1000, cts.Token); continue; } } string json = await response.Content.ReadAsStringAsync().AsTask(cts.Token); return(JsonConvert.DeserializeObject <VKLongPollResponse>(json)); } } throw new Exception("Exit from GetResponse loop"); }
/// <summary> /// Попытаться загрузить данные для подключения к LongPoll-Сервису ВКонтакте. /// Возвращает успешность операции. /// </summary> private async Task <bool> GetServerData(bool trace = false) { #if DEBUG Debug.WriteLine("Getting LongPoll Server Data..."); #endif if (trace) { CoreHelper.SendInAppPush( "Получение данных для подключения к серверу...", "Выполняется подключение", PopupMessageType.Info); } var response = await(new GetLongPollServerRequest { NeedPts = VKBoolean.True }).ExecuteAsync(_cts.Token); if (response.Error.ErrorType == VKErrors.None) { _serverData = response.Response; return(true); } else { if (_numberOfRetries == 5) { #if DEBUG Debug.WriteLine("Getting of LongPoll server data failed. Stopping the service..."); #endif if (trace) { CoreHelper.SendInAppPush( "Не удалось получить данные для подключения к серверу", "Сервис мгновенных сообщений", PopupMessageType.Error); } Stop(LongPollStopReason.CantGetServerData); return(false); } _numberOfRetries++; #if DEBUG Debug.WriteLine(String.Format("LongPoll connecton error. Attempt number: {0}. Attempt after {1} seconds.", _numberOfRetries, 5 * _numberOfRetries)); #endif if (trace) { CoreHelper.SendInAppPush( "Повтор через " + 5 * _numberOfRetries + " секунд", "Ошибка соединения", PopupMessageType.Warning); } await Task.Delay(TimeSpan.FromSeconds(5 * _numberOfRetries)); return(await GetServerData(trace)); } }
/// <summary> /// Останавливает сервис работы с LongPoll-Сервисом ВКонтакте. /// </summary> /// <param name="reason">Причина остановки сервиса.</param> private void Stop(LongPollStopReason reason) { if (!IsWorking) { return; } IsWorking = false; _numberOfRetries = 0; _timer.Stop(); _timer.Tick -= Timer_Tick; if (_cts != null) { _cts.Cancel(true); } _serverData = null; OnServiceStopped(reason); }