in src/WebJobs.Script.WebHost/WebHostServiceCollectionExtensions.cs [75:239]
public static void AddWebJobsScriptHost(this IServiceCollection services, IConfiguration configuration)
{
services.AddHttpContextAccessor();
services.AddResponseCompression(options =>
{
options.EnableForHttps = true;
// Brotli and Gzip compression providers are added by default.
// Compression defaults to Brotli when the Brotli format is supported by the client
});
services.AddWebJobsScriptHostRouting();
services.AddMvc(o =>
{
o.EnableEndpointRouting = false;
o.Filters.Add(new ArmExtensionResourceFilter());
})
.AddNewtonsoftJson()
.AddXmlDataContractSerializerFormatters();
// Standby services
services.AddStandbyServices();
services.AddSingleton<IScriptHostManager>(s => s.GetRequiredService<WebJobsScriptHostService>());
services.AddSingleton<IScriptWebHostEnvironment, ScriptWebHostEnvironment>();
services.TryAddSingleton<IStandbyManager, StandbyManager>();
services.TryAddSingleton<IServiceCollection>(services);
services.TryAddSingleton<IScriptHostBuilder, DefaultScriptHostBuilder>();
// Metrics
services.AddSingleton<IHostMetricsProvider, HostMetricsProvider>();
services.AddSingleton<IHostMetrics, HostMetrics>();
// Linux container services
services.AddLinuxContainerServices();
// ScriptSettingsManager should be replaced. We're setting this here as a temporary step until
// broader configuration changes are made:
services.AddSingleton<ScriptSettingsManager>();
services.AddSingleton<IEventGenerator>(p =>
{
var environment = p.GetService<IEnvironment>();
if (environment.IsAnyLinuxConsumption())
{
var consoleLoggingOptions = p.GetService<IOptions<ConsoleLoggingOptions>>();
return new LinuxContainerEventGenerator(environment, consoleLoggingOptions);
}
else if (SystemEnvironment.Instance.IsLinuxAppService())
{
var hostNameProvider = p.GetService<HostNameProvider>();
IOptions<FunctionsHostingConfigOptions> functionsHostingConfigOptions = p.GetService<IOptions<FunctionsHostingConfigOptions>>();
IOptions<AzureMonitorLoggingOptions> azureMonitorOptions = p.GetService<IOptions<AzureMonitorLoggingOptions>>();
return new LinuxAppServiceEventGenerator(new LinuxAppServiceFileLoggerFactory(), hostNameProvider, functionsHostingConfigOptions, azureMonitorOptions);
}
else if (environment.IsAnyKubernetesEnvironment())
{
return new KubernetesEventGenerator();
}
else
{
return new EtwEventGenerator();
}
});
// Management services
services.AddSingleton<IFunctionsSyncManager, FunctionsSyncManager>();
services.AddSingleton<IFunctionMetadataManager, FunctionMetadataManager>();
services.AddSingleton<IWebFunctionsManager, WebFunctionsManager>();
services.AddHttpClient();
services.AddSingleton<StartupContextProvider>();
services.AddSingleton<IFileSystem>(_ => FileUtility.Instance);
services.AddTransient<VirtualFileSystem>();
services.AddTransient<VirtualFileSystemMiddleware>();
if (SystemEnvironment.Instance.IsFlexConsumptionSku())
{
services.AddSingleton<IInstanceManager, LegionInstanceManager>();
}
else
{
// Default IInstanceManager
services.AddSingleton<IInstanceManager, AtlasInstanceManager>();
}
// Logging and diagnostics
services.AddSingleton<IMetricsLogger, WebHostMetricsLogger>();
if (!FeatureFlags.IsEnabled(ScriptConstants.FeatureFlagDisableDiagnosticEventLogging))
{
services.AddSingleton<ILoggerProvider, DiagnosticEventLoggerProvider>();
services.TryAddSingleton<IDiagnosticEventRepository, DiagnosticEventTableStorageRepository>();
services.TryAddSingleton<IDiagnosticEventRepositoryFactory, DiagnosticEventRepositoryFactory>();
}
// Secret management
services.TryAddSingleton<ISecretManagerProvider, DefaultSecretManagerProvider>();
// Shared memory data transfer and function data cache
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
services.AddSingleton<IMemoryMappedFileAccessor, MemoryMappedFileAccessorWindows>();
}
else
{
services.AddSingleton<IMemoryMappedFileAccessor, MemoryMappedFileAccessorUnix>();
}
services.AddSingleton<ISharedMemoryManager, SharedMemoryManager>();
services.AddSingleton<IFunctionDataCache, FunctionDataCache>();
// Grpc
services.AddScriptGrpc();
// Register common services with the WebHost
// Language Worker Hosted Services need to be intialized before WebJobsScriptHostService
ScriptHostBuilderExtensions.AddCommonServices(services);
services.AddSingleton<IWorkerFunctionMetadataProvider, WorkerFunctionMetadataProvider>();
services.AddSingleton<IHostFunctionMetadataProvider, HostFunctionMetadataProvider>();
services.AddSingleton<IFunctionMetadataProvider, FunctionMetadataProvider>();
// Core script host services
services.AddSingleton<WebJobsScriptHostService>();
services.AddSingleton<IHostedService>(s => s.GetRequiredService<WebJobsScriptHostService>());
// Performs function assembly analysis to generete log use of unoptimized assemblies.
services.AddSingleton<IHostedService, AssemblyAnalyzer.AssemblyAnalysisService>();
// Performs checks to see if the sas token within the urls are expired.
services.AddSingleton<IHostedService, Health.TokenExpirationService>();
// Manages a diagnostic listener that subscribes to diagnostic sources setup in the host
// and persists events in the logging infrastructure.
services.AddSingleton<IHostedService, DiagnosticListenerService>();
// Handles shutdown of services that need to happen after StopAsync() of all services of type IHostedService are complete.
// Order is important.
// All other IHostedService injections need to go before this.
services.AddSingleton<IHostedService, HostedServiceManager>();
// Configuration
// ScriptApplicationHostOptions are special in that they need to be reset on specialization, but the reset
// must happen after the StandbyOptions have reset. For this reason, we have a special ChangeTokenSource that
// will reset the ScriptApplicationHostOptions only after StandbyOptions have been reset.
services.ConfigureOptions<ScriptApplicationHostOptionsSetup>();
services.AddSingleton<IOptionsChangeTokenSource<ScriptApplicationHostOptions>, ScriptApplicationHostOptionsChangeTokenSource>();
services.ConfigureOptions<StandbyOptionsSetup>();
services.ConfigureOptions<LanguageWorkerOptionsSetup>();
services.ConfigureOptionsWithChangeTokenSource<AppServiceOptions, AppServiceOptionsSetup, SpecializationChangeTokenSource<AppServiceOptions>>();
services.ConfigureOptionsWithChangeTokenSource<HttpBodyControlOptions, HttpBodyControlOptionsSetup, SpecializationChangeTokenSource<HttpBodyControlOptions>>();
services.ConfigureOptionsWithChangeTokenSource<ResponseCompressionOptions, ResponseCompressionOptionsSetup, SpecializationChangeTokenSource<ResponseCompressionOptions>>();
services.ConfigureOptions<FlexConsumptionMetricsPublisherOptionsSetup>();
services.ConfigureOptions<LinuxConsumptionLegionMetricsPublisherOptionsSetup>();
services.ConfigureOptions<ConsoleLoggingOptionsSetup>();
services.ConfigureOptions<AzureMonitorLoggingOptionsSetup>();
services.AddHostingConfigOptions(configuration);
services.ConfigureOptions<ExtensionRequirementOptionsSetup>();
// Refresh LanguageWorkerOptions when HostBuiltChangeTokenSource is triggered.
services.ConfigureOptionsWithChangeTokenSource<LanguageWorkerOptions, LanguageWorkerOptionsSetup, HostBuiltChangeTokenSource<LanguageWorkerOptions>>();
services.TryAddSingleton<IDependencyValidator, DependencyValidator>();
services.TryAddSingleton<IJobHostMiddlewarePipeline>(s => DefaultMiddlewarePipeline.Empty);
// Add AzureBlobStorageProvider to WebHost (also needed for ScriptHost) and AzureTableStorageProvider
services.AddAzureStorageProviders();
}