Esempio n. 1
0
        /// <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.");
        }