public static new StatusResults RefreshStatus(SubmissionInfo submissionData, StatusResults previousStatus) { string additionalLogDetails = ""; try { if (!string.IsNullOrWhiteSpace(previousStatus.State)) { var stateData = JsonConvert.DeserializeObject <UpdStatusState>(previousStatus.State); additionalLogDetails += "Submitted Fax with etherFAX ID: " + stateData.jobId + "\r\n"; additionalLogDetails += "etherFAX Tag: " + stateData.tagValue + "\r\n"; string decryptedPassword = Encoding.UTF8.GetString(ProtectedData.Unprotect(Convert.FromBase64String(stateData.password), _encryptionEntropy, DataProtectionScope.LocalMachine)); var client = new SampleEtherFaxApi(stateData.account, stateData.username, decryptedPassword); FaxStatus faxStatus = client.GetFaxStatus(stateData.jobId); if (faxStatus.FaxResult == FaxResult.Success) // Success { return(new StatusResults() { Result = true, StatusCode = 100, Message = "Your fax was delivered successfully.", NotifyUser = true, LogDetails = "Your fax was delivered successfully!\r\n" + additionalLogDetails }); } else if (faxStatus.FaxResult == FaxResult.InProgress) // Incomplete - check status again { return(new StatusResults() { Result = false, StatusCode = 200 + (int)faxStatus.State, SeverityLevel = StatusResults.SeverityLevels.Low, Message = "Fax in progress. " + faxStatus.State.ToString().Replace("_", " ") + "... " + faxStatus.PagesDelivered + " pages delivered.", NextStatusRefresh = DateTime.Now.AddSeconds(30), State = previousStatus.State, LogDetails = "Fax in progress. " + faxStatus.State.ToString().Replace("_", " ") + "... " + faxStatus.PagesDelivered + " pages delivered.\r\n" + additionalLogDetails }); } else if (faxStatus.FaxResult == FaxResult.Cancelled) // Cancelled { return(new StatusResults() { Result = false, StatusCode = 300, SeverityLevel = StatusResults.SeverityLevels.Low, Message = "Your fax was cancelled.", LogDetails = "Fax cancelled: " + faxStatus.ToString().Replace("_", " ") + "\r\n" + additionalLogDetails, NotifyUser = true }); } else // All errors { return(new StatusResults() { Result = false, StatusCode = 400 + (int)faxStatus.FaxResult, SeverityLevel = StatusResults.SeverityLevels.High, Message = "Your fax was not delivered. Reason: " + faxStatus.ToString().Replace("_", " "), LogDetails = "Fax failed: " + faxStatus.ToString().Replace("_", " ") + "\r\n" + additionalLogDetails, NotifyUser = true }); } } else { return(new StatusResults() { Result = false, StatusCode = 900, SeverityLevel = StatusResults.SeverityLevels.Critical, Message = "Cannot refresh the status. Reason: Missing state data.", LogDetails = "Fax failed: Missing state data." + "\r\n" + additionalLogDetails, NotifyUser = true }); } } catch (WebException httpEx) { string webExDetails = ""; using (var httpResponse = httpEx.Response as HttpWebResponse) { if (httpResponse != null) { HttpStatusCode statusCode = httpResponse.StatusCode; string statusDescription = httpResponse.StatusDescription; string responseHeaders = httpResponse.Headers != null?httpResponse.Headers.ToString() : null; using (Stream stream = httpResponse.GetResponseStream()) { using (var sr = new StreamReader(stream)) { string content = sr.ReadToEnd(); webExDetails = "Status: " + statusCode.ToString() + @"/" + statusDescription + "\r\n\r\n" + "Response: " + content; } } } } return(new StatusResults() { Result = false, StatusCode = 901, SeverityLevel = StatusResults.SeverityLevels.Critical, Message = "An error has occurred checking the status.", NextStatusRefresh = DateTime.Now.AddSeconds(30), LogDetails = httpEx.Message + "\r\n\r\n" + webExDetails + "\r\n" + additionalLogDetails, NotifyUser = true, State = previousStatus.State }); } catch (Exception ex) { UpdStatusState stateData = null; try { stateData = JsonConvert.DeserializeObject <UpdStatusState>(previousStatus.State); stateData.statusRetryCount++; } catch (Exception stateEx) { ex = new AggregateException(new List <Exception>() { ex, stateEx }); } var result = new StatusResults() { Result = false, StatusCode = 902, SeverityLevel = StatusResults.SeverityLevels.Critical, Message = "An error has occurred checking the status.", NextStatusRefresh = DateTime.Now.AddSeconds(30), LogDetails = ex.Message + "\r\n" + additionalLogDetails, NotifyUser = true, State = previousStatus.State }; if (stateData != null && stateData.statusRetryCount < MAX_REFRESH_ERRORS) { result.NextStatusRefresh = DateTime.Now.AddSeconds(30); } return(result); } }