/// <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); }
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;