public async Task <TResult> GetAsync <TResult>(Uri hostname, string relativeUri,
                                                       CancellationToken cancellationToken,
                                                       IEnumerable <KeyValuePair <string, string> > requestParameters = null,
                                                       IEnumerable <KeyValuePair <string, string> > extraHeaders      = null)
            where TResult : class
        {
            SimpleServiceResult <TResult, TResult> result =
                await GetAsync <TResult, TResult>(hostname, relativeUri, cancellationToken, requestParameters, extraHeaders);

            return(result.Result ?? result.ErrorResult);
        }
        private async Task <TResult> RetryOnExpiredTokenAsync <TResult>(CancellationToken cancellationToken, Func <CancellationToken, Task <SimpleServiceResult <TResult, TResult> > > action)
            where TResult : class
        {
            SimpleServiceResult <TResult, TResult> result = await action(cancellationToken);

            if ((result.HttpStatusCode == HttpStatusCode.Unauthorized || result.HttpStatusCode == HttpStatusCode.Forbidden) &&
                result.AuthorizationTokenInvalid != null &&
                result.AuthorizationTokenInvalid.Value == AuthorizationTokenInvalid.Expired)
            {
                if (xToken != null && await xToken.RefreshAsync(cancellationToken))
                {
                    result = await action(cancellationToken);
                }
            }

            return(result.Result ?? result.ErrorResult);
        }