Esempio n. 1
0
        public RestResponse(RestSerializer restSerializer, IRestRequest request)
        {
            restSerializer.AssertNotNull(nameof(restSerializer));
            request.AssertNotNull(nameof(request));

            RestSerializer = restSerializer;
            Request        = request;
        }
Esempio n. 2
0
        public async Task <IResponse> ExecuteAsync(IRestRequest request, CancellationToken cancellationToken)
        {
            request.AssertNotNull(nameof(request));

            _container.ExecuteFor <IRestRequestEnricher>(x => x.Enrich(request));
            _container.ExecuteFor <IRestRequestValidator>(x => x.ValidateRequest(request));
            //логирование IRequest должно быть тут, а логи http как раз в execstrategy

            using (var client = _clientFactory.CreateClient())
            {
                if (request.Timeout.HasValue)
                {
                    client.Timeout = request.Timeout.Value;
                }

                var context = new HttpExecutionContext
                {
                    Invoker           = client,
                    CancellationToken = cancellationToken
                };

                try
                {
                    await _executionStrategy.ExecuteAsync(() => _requestMapper.MapRequest(request), context);

                    if (context.IsTimeout)
                    {
                        throw new RestException(RestExceptionKind.Timeout, context.ErrorMessage);
                    }

                    if (context.IsError)
                    {
                        throw new RestException(RestExceptionKind.Http, context.ErrorMessage);
                    }

                    var response = _httpResponseMapper.MapResponse(context.ResponseMessage, request);
                    _container.ExecuteFor <IRestResponseValidator>(x => x.ValidateResponse(response));

                    return(response);
                }
                finally
                {
                    context.ResponseMessage?.Dispose();
                }
            }
        }