예제 #1
0
        public void TestEndpoint(RoutingEndpoint endpoint)
        {
            if (endpoint.Instances?.Instance == null)
            {
                return;
            }

            foreach (var instance in endpoint.Instances.Instance)
            {
                this.TestServiceInstance(endpoint, instance);
            }
        }
예제 #2
0
        private void TestServiceInstance(RoutingEndpoint endpoint, Instance instance)
        {
            var healthCheck = endpoint.HealthCheck;

            if (healthCheck == null)
            {
                return;
            }

            Uri    u             = new Uri(instance.Url);
            string host          = u.Host;
            string monitoringUri = u.Scheme + "://" + host + ":" + u.Port + (healthCheck.MonitoringPath.StartsWith("/") ? "" : "/") + healthCheck.MonitoringPath;

            HttpClient httpClient;

            if (this.httpClientMessageHandler == null)
            {
                httpClient = new HttpClient();
            }
            else
            {
                httpClient = new HttpClient(this.httpClientMessageHandler, disposeHandler: true);
            }

            try
            {
                using (var request = new HttpRequestMessage(new HttpMethod("get"), monitoringUri))
                {
                    var responseTask = httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
                    responseTask.Wait(TimeoutMilliseconds);

                    if (responseTask.IsCanceled || responseTask.IsFaulted)
                    {
                        // timeout occured or an error
                        instance.Status = InstanceStatuses.Down;
                        return;
                    }

                    var response = responseTask.Result;

                    if (!response.IsSuccessStatusCode)
                    {
                        instance.Status = InstanceStatuses.Down;
                        return;
                    }

                    if (response.IsSuccessStatusCode && string.IsNullOrEmpty(healthCheck.ResponseShouldContainString))
                    {
                        instance.Status = InstanceStatuses.Up;
                        return;
                    }

                    var readResponseStreamTask = response.Content.ReadAsStreamAsync();
                    readResponseStreamTask.Wait(TimeoutMilliseconds);

                    var responseStream = readResponseStreamTask.Result;

                    if (readResponseStreamTask.IsCanceled || readResponseStreamTask.IsFaulted)
                    {
                        instance.Status = InstanceStatuses.Down;
                        return;
                    }

                    using (var sr = new StreamReader(responseStream))
                    {
                        string responseString = sr.ReadToEnd();

                        if (responseString.Contains(healthCheck.ResponseShouldContainString))
                        {
                            instance.Status = InstanceStatuses.Up;
                            return;
                        }
                        else
                        {
                            instance.Status = InstanceStatuses.Down;
                            return;
                        }
                    }
                }
            }
            catch (Exception)
            {
                instance.Status = InstanceStatuses.Down;
            }
            finally
            {
                if (httpClient != null)
                {
                    httpClient.Dispose();
                }
            }
        } // TestServiceInstance