예제 #1
0
        private async Task <HttpResponseMessage> ResponseViaTCP(UrlConfigurationSection urlConfiguration)
        {
            HttpResponseMessage result;
            var server = ConfigurationSection.UrlConfiguration.BaseUrl.Split("//").LastOrDefault().Split(':').FirstOrDefault();
            var port   = int.Parse(ConfigurationSection.UrlConfiguration.BaseUrl.Split(':').LastOrDefault());

            // var server = ConfigurationSection.UrlConfiguration.BaseUrl.Split("//").LastOrDefault();
            // var port = 80;
            using (var tcpClient = new TcpClient())
            {
                tcpClient.Connect(server, port);
                using NetworkStream networkStream = tcpClient.GetStream();
                networkStream.ReadTimeout         = ConfigurationSection.RequestConfiguration.Timeout;
                using var writer = new StreamWriter(networkStream);
                var message = $@"{urlConfiguration.Method} / HTTP/1.1
Host: {server}" + "\r\n\r\n";

                using var reader = new StreamReader(networkStream, Encoding.UTF8);
                byte[] bytes = Encoding.UTF8.GetBytes(message);
                networkStream.Write(bytes, 0, bytes.Length);
                var readToEnd = reader.ReadToEnd();
                //Console.WriteLine(readToEnd);
                var successCodes = new string[]
                { "HTTP/1.1 200", "HTTP/1.1 201", "HTTP/1.1 202", "HTTP/1.1 203", "HTTP/1.1 204" };

                result = new HttpResponseMessage
                {
                    StatusCode = successCodes.Any(x => readToEnd.Contains(x)) ? HttpStatusCode.OK : HttpStatusCode.BadRequest
                };
            }

            return(result);
        }
예제 #2
0
 private Task <HttpResponseMessage> ResponseViaHttpClient(UrlConfigurationSection urlConfiguration)
 {
     lock (_httpClient)
     {
         if (_httpClient.BaseAddress == null)
         {
             _httpClient.BaseAddress = new Uri(urlConfiguration.BaseUrl);
         }
         var httpMethod = new HttpMethod(urlConfiguration.Method);
         return(_httpClient.SendAsync(new HttpRequestMessage(httpMethod, urlConfiguration.Action)));
     }
 }
예제 #3
0
        private async Task <HttpResponseMessage> Get(UrlConfigurationSection urlConfiguration)
        {
            switch (ConfigurationSection.RunPolicy)
            {
            case RunPolicyEnum.RETRY:
                return((await _resiliencePatterns.RetryPolicy
                        .ExecuteAndCaptureAsync(async() => await MakeRequest(urlConfiguration)))
                       .Result);

            case RunPolicyEnum.CIRCUIT_BREAKER:
                return((await _resiliencePatterns.CircuitBreakerPolicy
                        .ExecuteAndCaptureAsync(() => MakeRequest(urlConfiguration)))
                       .Result);

            case RunPolicyEnum.ALL:
                return((await _resiliencePatterns.RetryPolicy
                        .ExecuteAndCaptureAsync(() =>
                                                _resiliencePatterns.CircuitBreakerPolicy.ExecuteAsync(() => MakeRequest(urlConfiguration))))
                       .Result);

            case RunPolicyEnum.NONE:
                try
                {
                    return(await MakeRequest(urlConfiguration));
                }
                catch (RequestException e)
                {
                    return(HandleClientResult(e.HttpResponseMessage));
                }
                catch (Exception e)
                {
                    return(HandleClientResult(null));
                }

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
예제 #4
0
        private async Task <HttpResponseMessage> MakeRequest(UrlConfigurationSection urlConfiguration)
        {
            try
            {
                var stopWatch = new Stopwatch();
                stopWatch.Start();

                HttpResponseMessage result = null;
                // result = await ResponseViaTCP(urlConfiguration);
                result = await ResponseViaHttpClient(urlConfiguration);

                stopWatch.Stop();

                if (result.IsSuccessStatusCode)
                {
                    _metrics.IncrementeResilienceModuleSuccess();
                    _metrics.IncrementeResilienceModuleSuccessTime(stopWatch.ElapsedMilliseconds);
                }
                else
                {
                    _metrics.IncrementeResilienceModuleErrorTime(stopWatch.ElapsedMilliseconds);
                }

                if (!result.IsSuccessStatusCode)
                {
                    throw new RequestException(result);
                }

                return(result);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                _metrics.IncrementeResilienceModuleError();
                throw;
            }
        }
 public HttpResponseMessage HandleRequest(UrlConfigurationSection urlConfiguration)
 => _configurationSection.RunPolicy switch
 {
예제 #6
0
        public async Task <HttpResponseMessage> HandleRequest(UrlConfigurationSection urlConfiguration)
        {
            var httpResponseMessage = await Get(urlConfiguration);

            return(HandleClientResult(httpResponseMessage));
        }