public async Task <Guid> RequestCallbackAsync(Uri callbackUri, DateTimeOffset callbackTime, CancellationToken cancellationToken)
        {
            if (callbackUri == null)
            {
                throw new ArgumentNullException(nameof(callbackUri));
            }

            if (!callbackUri.IsAbsoluteUri)
            {
                throw new ArgumentException("Callback Uri is not an absolute Uri.", nameof(callbackUri));
            }

            var serviceBaseUri = new ServiceBaseUri(_clientSetting);

            try
            {
                bool       isDisposalRequired;
                HttpClient httpClient = AcquireHttpClient(out isDisposalRequired);

                try
                {
                    Uri    requestUri = BuildScheduleRequestUri(serviceBaseUri, callbackTime.UtcDateTime, callbackUri);
                    string authorizationHeaderValue = _validator.Issue(callbackUri);
                    using (var requestMessage = new HttpRequestMessage(HttpMethod.Put, requestUri))
                    {
                        if (!string.IsNullOrEmpty(authorizationHeaderValue))
                        {
                            requestMessage.Headers.Add(_RevaleeAuthHttpHeaderName, authorizationHeaderValue);
                        }

                        using (HttpResponseMessage response = await httpClient.SendAsync(requestMessage, HttpCompletionOption.ResponseContentRead, cancellationToken).ConfigureAwait(false))
                        {
                            if (response.IsSuccessStatusCode)
                            {
                                string responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

                                return(Guid.ParseExact(responseText, "D"));
                            }
                            else
                            {
                                throw new RevaleeRequestException(serviceBaseUri, callbackUri,
                                                                  new WebException(string.Format("The remote server returned an error: ({0}) {1}.",
                                                                                                 (int)response.StatusCode, response.ReasonPhrase), WebExceptionStatus.ProtocolError));
                            }
                        }
                    }
                }
                finally
                {
                    if (isDisposalRequired)
                    {
                        httpClient.Dispose();
                    }
                }
            }
            catch (AggregateException aex)
            {
                throw new RevaleeRequestException(serviceBaseUri, callbackUri, aex.Flatten().InnerException);
            }
            catch (WebException wex)
            {
                throw new RevaleeRequestException(serviceBaseUri, callbackUri, wex);
            }
        }