private static bool PostToService(FailSubmissionDto failSubmission) { if (!failSubmission.FailOccurrences.Any()) { return(true); } var postRequest = WebRequest.Create(UrlLookup.ReportFailUrl); postRequest.Method = "POST"; postRequest.ContentType = "application/json; charset=utf-8'"; postRequest.Headers.Add("x-appfail-version", UrlLookup.ReportApiVersion); var postData = _javaScriptSerializer.Serialize(failSubmission); var encoding = new ASCIIEncoding(); byte[] data = encoding.GetBytes(postData); postRequest.ContentLength = postData.Length; try { using (var requestStream = postRequest.GetRequestStream()) { requestStream.Write(data, 0, data.Length); } //We need to be careful here - if the remote server returned an error: (500) Internal Server Error try { using (var responseStream = postRequest.GetResponse().GetResponseStream()) { Debug.Assert(responseStream != null, "responseStream != null"); using (var reader = new StreamReader(responseStream)) { var result = reader.ReadToEnd(); } } } catch (WebException webException) { Debug.WriteLine(String.Format("Could not connect to the API - {0}", webException.Message)); } catch (Exception exception) { Debug.WriteLine(String.Format("An exception occured - {0}", exception.Message)); } return(true); } catch (IOException) { } catch (WebException) { } return(false); }
public override WaitHandle DoWork() { var failOccurrences = FailQueue.Dequeue(ConfigurationModel.Instance.ReportingMinimumBatchSize); if (failOccurrences.Count() > 0) { var failSubmission = new FailSubmissionDto(ConfigurationModel.Instance.ApiToken, failOccurrences); if (!PostToService(failSubmission)) { // Submission fails, so add these back to the reporting queue foreach (var occurrence in failOccurrences) { occurrence.IncrementSubmissionAttempts(); if (occurrence.SubmissionAttempts < ConfigurationModel.Instance.ReportingSubmissionAttempts) { FailQueue.Enqueue(occurrence); } } } } // Return the wait handle that will signal to // call this worker method when the queue is not empty. return(FailQueue.WaitHandle); }