public void TestEndpoint(RoutingEndpoint endpoint) { if (endpoint.Instances?.Instance == null) { return; } foreach (var instance in endpoint.Instances.Instance) { this.TestServiceInstance(endpoint, instance); } }
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