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); } }