/// <summary> /// Query Google Async. /// </summary> /// <param name="request"></param> /// <param name="timeout"></param> /// <param name="token"></param> /// <returns>Task[TResponse]</returns> protected internal static Task <TResponse> QueryGoogleApiAsync(TRequest request, TimeSpan timeout, CancellationToken token = default(CancellationToken)) { if (request == null) { throw new ArgumentNullException(nameof(request)); } var uri = request.GetUri(); var webClient = new WebClientTimeout(timeout); var taskCompletionSource = new TaskCompletionSource <TResponse>(); if (request is IJsonRequest) { webClient.Headers.Add(HttpRequestHeader.ContentType, "application/json"); var jsonSerializerSettings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; var jsonString = JsonConvert.SerializeObject(request, jsonSerializerSettings); webClient.UploadStringTaskAsync(uri, WebRequestMethods.Http.Post, jsonString) .ContinueWith(x => GenericEngine <TRequest, TResponse> .JsonRequestAsync(x, taskCompletionSource), TaskContinuationOptions.ExecuteSynchronously); return(taskCompletionSource.Task); } if (request is IQueryStringRequest) { webClient.DownloadDataTaskAsync(uri, timeout, token) .ContinueWith(x => GenericEngine <TRequest, TResponse> .QuerystringRequestAsync(x, taskCompletionSource), TaskContinuationOptions.ExecuteSynchronously); return(taskCompletionSource.Task); } throw new InvalidOperationException("Invalid Request. Request class missing Request interface implementation."); }