/// <summary> /// Implementation of raw file-returning async API /// </summary> /// <param name="verb"></param> /// <param name="relativePath"></param> /// <param name="content"></param> /// <returns></returns> private async Task <FileResult> RestCallFileAsync(string verb, AvaTaxPath relativePath, object content = null) { CallDuration cd = new CallDuration(); using (var result = await InternalRestCallAsync(cd, verb, relativePath, content).ConfigureAwait(false)) { // Read the result if (result.IsSuccessStatusCode) { var fr = new FileResult() { ContentType = result.Content.Headers.GetValues("Content-Type").FirstOrDefault(), Filename = GetDispositionFilename(result.Content.Headers.GetValues("Content-Disposition").FirstOrDefault()), Data = await result.Content.ReadAsByteArrayAsync().ConfigureAwait(false) }; cd.FinishParse(); this.LastCallTime = cd; return(fr); // Handle exceptions and convert them to AvaTax results } else { var s = await result.Content.ReadAsStringAsync().ConfigureAwait(false); var err = JsonConvert.DeserializeObject <ErrorResult>(s); cd.FinishParse(); this.LastCallTime = cd; throw new AvaTaxError(err); } } }
/// <summary> /// Implementation of raw file-returning async API /// </summary> /// <param name="verb"></param> /// <param name="relativePath"></param> /// <param name="content"></param> /// <returns></returns> private async Task <FileResult> RestCallFileAsync(string verb, AvaTaxPath relativePath, object content = null) { CallDuration cd = new CallDuration(); // Convert the JSON payload, if any string jsonPayload = null; if (content != null) { jsonPayload = JsonConvert.SerializeObject(content, SerializerSettings); } // Call REST using (var result = await InternalRestCallAsync(cd, verb, relativePath, jsonPayload).ConfigureAwait(false)) { // Read the result if (result.IsSuccessStatusCode) { var fr = new FileResult() { ContentType = result.Content.Headers.GetValues("Content-Type").FirstOrDefault(), Filename = GetDispositionFilename(result.Content.Headers.GetValues("Content-Disposition").FirstOrDefault()), Data = await result.Content.ReadAsByteArrayAsync().ConfigureAwait(false) }; // Capture timings cd.FinishParse(); this.LastCallTime = cd; // Capture information about this API call and make it available for logging var eventargs = new AvaTaxCallEventArgs() { HttpVerb = verb.ToUpper(), Code = result.StatusCode, RequestUri = new Uri(_envUri, relativePath.ToString()), RequestBody = jsonPayload, ResponseBody = fr.Data, Duration = cd }; OnCallCompleted(eventargs); return(fr); // Handle exceptions and convert them to AvaTax results } else { var errorResponseString = await result.Content.ReadAsStringAsync().ConfigureAwait(false); var err = JsonConvert.DeserializeObject <ErrorResult>(errorResponseString); cd.FinishParse(); this.LastCallTime = cd; // Capture information about this API call error and make it available for logging var eventargs = new AvaTaxCallEventArgs() { HttpVerb = verb.ToUpper(), Code = result.StatusCode, RequestUri = new Uri(_envUri, relativePath.ToString()), RequestBody = jsonPayload, ResponseString = errorResponseString, Duration = cd }; OnCallCompleted(eventargs); throw new AvaTaxError(err, result.StatusCode); } } }
/// <summary> /// Implementation of asynchronous client APIs /// </summary> /// <typeparam name="T"></typeparam> /// <param name="verb"></param> /// <param name="relativePath"></param> /// <param name="content"></param> /// <returns></returns> public async Task <T> RestCallAsync <T>(string verb, AvaTaxPath relativePath, object content = null) { CallDuration cd = new CallDuration(); var s = await RestCallStringAsync(verb, relativePath, content, cd).ConfigureAwait(false); var o = JsonConvert.DeserializeObject <T>(s); cd.FinishParse(); this.LastCallTime = cd; return(o); }