Exemplo n.º 1
0
        /// <summary>
        /// Выполнить конфигурацию базового микросервиса, которая включает в себя конфигурацию Consul,
        /// а так же конфигурацию логирования.
        /// </summary>
        /// <param name="hostBuilder">The host builder.</param>
        /// <param name="consulConfigurationOptions">The configuration options.</param>
        public static IHostBuilder ConfigureBasicMicroservice(
            this IHostBuilder hostBuilder,
            ConsulConfigurationOptions?consulConfigurationOptions = null)
        {
            hostBuilder.ConfigureCustomCertificates();
            hostBuilder.ConfigureConsul(consulConfigurationOptions);
            hostBuilder.ConfigureSerilogLogging();
            hostBuilder.UseVersionApiPoint();
            hostBuilder.ConfigureAuthorizationPolicies();
            hostBuilder.ConfigBasicHttpService(opts =>
            {
                var headerOptions = new RestHttpClientHeaderOptions();
                headerOptions.AddForwardedHeader(MicroserviceConstants.EventIdHeader);
                headerOptions.AddForwardedHeader(MicroserviceConstants.UserspaceIdHeader);
                headerOptions.AddForwardedHeader(MicroserviceConstants.CultureHeader);

                opts.ConfigHeaders(headerOptions);
            });

            hostBuilder.ConfigureServices((context, services) =>
            {
                services.AddHttpContextAccessor();
                services.AddOptions();
                services.AddDistributedMemoryCache();
                services.Configure <AppConfiguration>(context.Configuration);
            });

            return(hostBuilder);
        }
        public static IHostBuilder CreateDefaultBuilder(string[] args, ConsoleHostConfigurationOptions?options = null)
        {
            var consoleBuilder = new ConsoleBuilder();

            consoleBuilder.ConfigureAppConfiguration((builderContext, config) =>
            {
                var env = builderContext.HostingEnvironment;
                config.AddJsonFile("appsettings.json", optional: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
            });

            consoleBuilder.ConfigureCustomCertificates();

            consoleBuilder.ConfigureConsul(options?.ConsulConfigurationOptions);
            consoleBuilder.ConfigureSerilogLogging();
            consoleBuilder.ConfigBasicHttpService(opts =>
            {
                var headerOptions = new RestHttpClientHeaderOptions();
                headerOptions.AddForwardedHeader(MicroserviceConstants.EventIdHeader);
                headerOptions.AddForwardedHeader(MicroserviceConstants.UserspaceIdHeader);
                headerOptions.AddForwardedHeader(MicroserviceConstants.CultureHeader);

                opts.ConfigHeaders(headerOptions);
            });

            consoleBuilder.ConfigureServices((context, services) =>
            {
                services.AddOptions();
                services.Configure <AppConfiguration>(context.Configuration);
                services.AddLogging();
                ConfigureMetrics(context, services);
            });

            return(consoleBuilder);
        }
Exemplo n.º 3
0
 public static IHostBuilder CreateHostBuilder(string[] args) =>
 Host.CreateDefaultBuilder(args)
 .ConfigBasicHttpService(opts =>
 {
     var headerOptions = new RestHttpClientHeaderOptions();
     headerOptions.AddForwardedHeader("X-Trace-Event-Id");
     headerOptions.AddForwardedHeader("Accept-Language");
     opts.ConfigHeaders(headerOptions);
 })
 .ConfigureWebHostDefaults(webBuilder => webBuilder.UseStartup <Startup>());
        public async Task ShouldProperlyMakeGetRequestByAbsoluteUriWithForwardedHeaders()
        {
            var modelJson = JsonConvert.SerializeObject(new Service[] {
                new Service {
                    Id = 1, Name = "Service1"
                },
                new Service {
                    Id = 2, Name = "Service2"
                }
            });
            var          traceEventId = Guid.NewGuid().ToString();
            const string userspaceId  = "10";
            const string uri          = "http://unittest/api/services";

            var httpContext = new DefaultHttpContext();

            httpContext.Request.Headers.Add(TraceEventIdHeader, traceEventId);
            httpContext.Request.Headers.Add(UserspaceIdHeader, userspaceId);

            var headerOptions = new RestHttpClientHeaderOptions();

            headerOptions.AddForwardedHeader(TraceEventIdHeader);
            headerOptions.AddForwardedHeader(UserspaceIdHeader);
            var conf = new RestHttpClientOptions();

            conf.ConfigHeaders(headerOptions);

            var client         = new HttpClient(CreateDefaultResponseHandler(HttpStatusCode.OK, modelJson));
            var restHttpClient = CreateRestHttpClient(client, httpContext, conf);

            var response = await restHttpClient.Get <IEnumerable <Service> >(uri, TimeSpan.FromSeconds(10));

            Assert.True(client.DefaultRequestHeaders.Contains(TraceEventIdHeader));
            Assert.True(client.DefaultRequestHeaders.Contains(UserspaceIdHeader));

            Assert.Equal(traceEventId, client.DefaultRequestHeaders.FirstOrDefault(x => x.Key == TraceEventIdHeader).Value.FirstOrDefault());
            Assert.Equal(userspaceId, client.DefaultRequestHeaders.FirstOrDefault(x => x.Key == UserspaceIdHeader).Value.FirstOrDefault());

            var services = response.ResultObject?.ToList();

            Assert.NotNull(services);
            Assert.Equal(2, services !.Count);
            Assert.Equal(1, services[0].Id);
            Assert.Equal("Service1", services[0].Name);
            Assert.Equal(2, services[1].Id);
            Assert.Equal("Service2", services[1].Name);
            var _logger = _loggers.First();

            Assert.Equal(2, _logger.LoggingEvents.Count);
            Assert.Equal($"Start downstream request GET {uri} with http forwarded headers=[{TraceEventIdHeader}, {traceEventId}], [{UserspaceIdHeader}, {userspaceId}].", _logger.LoggingEvents[0]);
            Assert.Contains($"Downstream request GET {uri} with http forwarded headers=[{TraceEventIdHeader}, {traceEventId}], [{UserspaceIdHeader}, {userspaceId}] finished with StatusCode {(int)HttpStatusCode.OK} at", _logger.LoggingEvents[1]);
        }
        public async Task ShouldProperlyReuseHttpClientObjectInParallelWithHeaders()
        {
            var modelJson = JsonConvert.SerializeObject(new Service[] {
                new Service {
                    Id = 1, Name = "Service1"
                },
                new Service {
                    Id = 2, Name = "Service2"
                }
            });

            const string uri = "http://unittest/api/services";

            var headerOptions = new RestHttpClientHeaderOptions();

            headerOptions.AddForwardedHeader(TraceEventIdHeader);
            headerOptions.AddForwardedHeader(UserspaceIdHeader);
            var conf = new RestHttpClientOptions();

            conf.ConfigHeaders(headerOptions);

            var httpContext = new DefaultHttpContext();

            httpContext.Request.Headers.Add(TraceEventIdHeader, "eventId");
            httpContext.Request.Headers.Add(UserspaceIdHeader, "12");
            const int totalRequests = 1000;

            var client         = new HttpClient(CreateDefaultResponseHandler(HttpStatusCode.OK, modelJson));
            var restHttpClient = CreateRestHttpClient(client, httpContext, conf);

            var firstResult = await restHttpClient.Get <IEnumerable <Service> >(uri, TimeSpan.FromSeconds(10));

            Assert.Equal(2, firstResult.ResultObject?.Count());

            var results = Enumerable.Range(0, totalRequests).AsParallel().AsOrdered().WithDegreeOfParallelism(10)
                          .Select(_ => restHttpClient.Get <IEnumerable <Service> >(uri, TimeSpan.FromSeconds(10)).GetAwaiter().GetResult())
                          .AsSequential()
                          .ToList();

            Assert.Empty(results.Where(x => x.OriginalResponse?.RequestMessage?.Headers.Count() != 2));
            Assert.Equal(2 * totalRequests, results.Where(x => x.ResultObject is not null).SelectMany(x => x.ResultObject).Count());
        }
 /// <summary>
 /// Configure processing of request headers.
 /// </summary>
 /// <param name="options">Configuration of handling http-headers.</param>
 public void ConfigHeaders(RestHttpClientHeaderOptions options) =>
 RestHttpClientHeaderOptions = options;