MobileAppTracking.MATUrlRequester.GetUrlCallback C# (CSharp) Метод

GetUrlCallback() приватный Метод

private GetUrlCallback ( IAsyncResult result ) : void
result IAsyncResult
Результат void
        private void GetUrlCallback(IAsyncResult result)
        {
            if (result == null || result.AsyncState == null)
            {
                return;
            }
            try
            {
                HttpWebRequest request = result.AsyncState as HttpWebRequest;
                HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result);

                using (Stream stream = response.GetResponseStream())
                {
                    StreamReader reader = new StreamReader(stream, Encoding.UTF8);
                    string responseString = "";
                    string line;
                    while ((line = reader.ReadLine()) != null)
                    {
                        responseString += line;
                    }
                    HttpStatusCode statusCode = response.StatusCode;

                    // If status between 200 and 300, success
                    if (statusCode >= HttpStatusCode.OK && statusCode < HttpStatusCode.MultipleChoices)
                    {
                        JToken root = JObject.Parse(responseString);

                        JToken successToken = root["success"];
                        bool success = successToken.ToString().ToLower().Equals("true");

                        if (success)
                        {
                            if (parameters.matResponse != null)
                                parameters.matResponse.DidSucceedWithData(responseString);

                            // Get site_event_type from json response
                            JToken siteEventTypeToken = root["site_event_type"];
                            string siteEventType = siteEventTypeToken.ToString();

                            // Only store log_id for opens
                            if (siteEventType.Equals("open"))
                            {
                                JToken logIdToken = root["log_id"];
                                string logId = logIdToken.ToString();

                                if (parameters.OpenLogId == null)
                                    parameters.OpenLogId = logId;
                                parameters.LastOpenLogId = logId;
                            }
                        }
                        else
                        {
                            if (parameters.matResponse != null)
                                parameters.matResponse.DidFailWithError(responseString);
                            if (currentUrlAttempt < MAX_NUMBER_OF_RETRY_ATTEMPTS)
                            {
                                Debug.WriteLine("MAT request failed, will be queued");
                                eventQueue.AddToQueue(currentUrl, currentPostData, ++currentUrlAttempt);
                            }
                            else
                            {
                                Debug.WriteLine("Exceeded maximum number of retries. Will not be requeued.");
                            }
                        }

                        if (parameters.DebugMode)
                            Debug.WriteLine("Server response is " + responseString);
                    }
                    else // Requeue all other requests
                    {
                        if (currentUrlAttempt < MAX_NUMBER_OF_RETRY_ATTEMPTS)
                        {
                            Debug.WriteLine("MAT request failed, will be queued");
                            eventQueue.AddToQueue(currentUrl, currentPostData, ++currentUrlAttempt);
                        }
                        else
                        {
                            Debug.WriteLine("Exceeded maximum number of retries. Will not be requeued.");
                        }
                    }
                }

                request = null;
                response = null;
            }
            catch (WebException e)
            {
                Debug.WriteLine(e.Message);
                // Requeue the request for SSL error
                // Have to convert to String because TrustFailure isn't accessible in this .NET WebExceptionStatus for some reason
                if (e.Status.ToString().Equals("TrustFailure"))
                {
                    if (currentUrlAttempt < MAX_NUMBER_OF_RETRY_ATTEMPTS)
                    {
                        Debug.WriteLine("SSL error, will be queued");
                        eventQueue.AddToQueue(currentUrl, currentPostData, ++currentUrlAttempt);
                    }
                    else
                    {
                        Debug.WriteLine("Exceeded maximum number of retries. Will not be requeued.");
                    }
                    return;
                }

                //For 400 (HttpWebRequest throws WebException on 4XX-5XX, so the logic must be written here)
                //We may want to switch to HttpClient for Windows Phone 8, but this requires downloading a separate library (still in beta, last I checked).
                //Within WebException is the only way to provide feedback to the client.
                if (e.Response != null)
                {
                    using (WebResponse webResponse = e.Response)
                    {
                        HttpWebResponse httpWebResponse = (HttpWebResponse)webResponse;
                        using (Stream stream = webResponse.GetResponseStream())
                        using (StreamReader streamReader = new StreamReader(stream, Encoding.UTF8))
                        {
                            string responseString = "";
                            string line;
                            while ((line = streamReader.ReadLine()) != null)
                            {
                                responseString += line;
                            }
                            if (httpWebResponse.StatusCode == HttpStatusCode.BadRequest && webResponse.Headers["X-MAT-Responder"] != null)
                            {
                                if (parameters.matResponse != null)
                                    parameters.matResponse.DidFailWithError((responseString));
                                Debug.WriteLine("MAT request received 400 error from server, won't be retried");
                            }
                            else //Requeue for any other status code
                            {
                                if (parameters.matResponse != null)
                                    parameters.matResponse.DidFailWithError((responseString));
                                if (currentUrlAttempt < MAX_NUMBER_OF_RETRY_ATTEMPTS)
                                {
                                    Debug.WriteLine("MAT request failed, will be queued");
                                    eventQueue.AddToQueue(currentUrl, currentPostData, ++currentUrlAttempt);
                                }
                                else
                                {
                                    Debug.WriteLine("Exceeded maximum number of retries. Will not be requeued.");
                                }
                            }
                        }
                    }
                }
            }
        }