示例#1
0
        /// <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);
        }