/// <summary> /// Adds Application Insights integration to this API, registering an <see cref="IApmTool" /> to allow /// tracking dependencies and operations, and middleware that will set properties of the current /// <see cref="RequestTelemetry" /> of the current HTTP context (if it exists). /// </summary> /// <param name="pipelineBuilder">The pipeline builder to configure.</param> /// <returns>This builder for further configuration.</returns> public static BlueprintApiBuilder AddApplicationInsights(this BlueprintApiBuilder pipelineBuilder) { pipelineBuilder.Services.AddSingleton <IApmTool, ApplicationInsightsApmTool>(); pipelineBuilder.Compilation(c => c.AddVariableSource(new HttpRequestTelemetrySource())); return(pipelineBuilder); }
/// <summary> /// Registers HTTP-specific functionality and handling to this API instance. /// </summary> /// <param name="apiBuilder">The builder to register with.</param> /// <param name="configure">An optional action that can configure <see cref="BlueprintHttpBuilder" />, executed /// <c>after</c> the default configuration has been run.</param> /// <returns>This builder.</returns> public static BlueprintApiBuilder Http( this BlueprintApiBuilder apiBuilder, Action <BlueprintHttpBuilder> configure = null) { apiBuilder.Services.AddSingleton <IHttpRequestStreamReaderFactory, MemoryPoolHttpRequestStreamReaderFactory>(); apiBuilder.Services.AddSingleton <IHttpResponseStreamWriterFactory, MemoryPoolHttpResponseStreamWriterFactory>(); apiBuilder.Services.TryAddSingleton <IHttpContextAccessor, HttpContextAccessor>(); apiBuilder.Services.AddOptions <BlueprintHttpOptions>(); apiBuilder.Services.AddOptions <BlueprintJsonOptions>(); apiBuilder.Services.Add(ServiceDescriptor.Transient <IConfigureOptions <BlueprintHttpOptions>, BlueprintHttpOptionsSetup>()); apiBuilder.Services.AddSingleton <IOutputFormatterSelector, DefaultOutputFormatterSelector>(); apiBuilder.Services.AddScoped <IApiLinkGenerator, ApiLinkGenerator>(); apiBuilder.AddMessageSource <HttpRouteMessagePopulationSource>(); apiBuilder.AddMessageSource <HttpBodyMessagePopulationSource>(); // "Owned" HTTP part sources apiBuilder.AddMessageSource( HttpPartMessagePopulationSource.Owned <FromCookieAttribute>( c => c.GetProperty("Request").GetProperty(nameof(HttpRequest.Cookies)), false)); apiBuilder.AddMessageSource( HttpPartMessagePopulationSource.Owned <FromHeaderAttribute>( c => c.GetProperty("Request").GetProperty(nameof(HttpRequest.Headers)), true)); apiBuilder.AddMessageSource( HttpPartMessagePopulationSource.Owned <FromQueryAttribute>( c => c.GetProperty("Request").GetProperty(nameof(HttpRequest.Query)), true)); // Catch-all query string population source apiBuilder.AddMessageSource( HttpPartMessagePopulationSource.CatchAll( "fromQuery", c => c.GetProperty("Request").GetProperty(nameof(HttpRequest.Query)), c => c.Descriptor.GetFeatureData <HttpOperationFeatureData>().HttpMethod == "GET", true)); apiBuilder.Services.AddSingleton <IOperationResultExecutor <ValidationFailedOperationResult>, ValidationFailedOperationResultExecutor>(); apiBuilder.Services.AddSingleton <IOperationResultExecutor <UnhandledExceptionOperationResult>, UnhandledExceptionOperationResultExecutor>(); apiBuilder.Services.AddSingleton <IOperationResultExecutor <OkResult>, OkResultOperationExecutor>(); apiBuilder.Services.AddSingleton <OkResultOperationExecutor>(); apiBuilder.Services.AddSingleton <IContextMetadataProvider, HttpContextMetadataProvider>(); apiBuilder.Operations(o => o .AddOperation <RootMetadataOperation>("AddHttp") .AddConvention(new HttpOperationScannerConvention())); apiBuilder.Compilation(c => c.AddVariableSource(new HttpVariableSource())); configure?.Invoke(new BlueprintHttpBuilder(apiBuilder.Services)); return(apiBuilder); }