非FunctionsStartup的Function App启动:Configure方法服务注入异常
问题描述
需要使用不继承FunctionsStartup的Startup.cs,现有Program和Startup代码如下,但Startup的Configure方法中WebJobsBuilderContext未注册导致报错,不清楚如何注册Function App相关服务。
现有Program代码
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration(x => { var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); var assembly = typeof(HostBuilderExtensions).Assembly; x.AddEmbeddedJsonFile(assembly, "sharedSettings.json") .AddEmbeddedJsonFile(assembly, $"sharedSettings.{environmentName}.json", true) .AddJsonFile("appsettings.json", true) .AddJsonFile($"appsettings.{environmentName}.json", true) .AddEnvironmentVariables() .Build(); }) .ConfigureFunctionsWorkerDefaults() .ConfigureWebHostDefaults(x => { x.UseStartup<Startup>(); }); }
现有Startup代码
public class Startup { private readonly IConfiguration _configuration; private readonly IWebHostEnvironment _environment; public Startup(IConfiguration configuration, IWebHostEnvironment environment) { _configuration = configuration; _environment = environment; } public void ConfigureServices(IServiceCollection services) { services.AddApplicationInsightsTelemetryWorkerService(); services.ConfigureFunctionsApplicationInsights(); var builder = services.ConfigureApp(_configuration) .AddDatabase<ApplicationContext>() .AddAutomapperProfilesFromAssemblies() .AddCaching() .AddMyDependencies() .AddStripeDependencies(); } public void Configure(WebJobsBuilderContext builder) { // this isn't registered... throwing error } }
解决方案
1. 调整Program.cs的宿主构建逻辑
在Azure Functions孤立模式下,ConfigureWebHostDefaults结合UseStartup的方式无法正确适配Functions的服务体系,需改为直接通过ConfigureServices调用Startup的服务配置逻辑,同时保留Functions Worker的默认配置:
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration(x => { var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); var assembly = typeof(HostBuilderExtensions).Assembly; x.AddEmbeddedJsonFile(assembly, "sharedSettings.json") .AddEmbeddedJsonFile(assembly, $"sharedSettings.{environmentName}.json", true) .AddJsonFile("appsettings.json", true) .AddJsonFile($"appsettings.{environmentName}.json", true) .AddEnvironmentVariables(); // 移除手动调用的Build(),宿主会自动处理配置构建 }) .ConfigureFunctionsWorkerDefaults() .ConfigureServices((context, services) => { // 实例化Startup并调用ConfigureServices完成服务注册 var startup = new Startup(context.Configuration, context.HostingEnvironment); startup.ConfigureServices(services); }); }
2. 移除Startup中的Configure方法
孤立模式下,WebJobsBuilderContext并非默认注入服务,且Functions的管道配置无需通过Configure方法处理。若需配置Functions特定行为,直接在ConfigureServices或Program的ConfigureFunctionsWorkerDefaults中添加即可:
public class Startup { private readonly IConfiguration _configuration; private readonly IWebHostEnvironment _environment; public Startup(IConfiguration configuration, IWebHostEnvironment environment) { _configuration = configuration; _environment = environment; } public void ConfigureServices(IServiceCollection services) { services.AddApplicationInsightsTelemetryWorkerService(); services.ConfigureFunctionsApplicationInsights(); var builder = services.ConfigureApp(_configuration) .AddDatabase<ApplicationContext>() .AddAutomapperProfilesFromAssemblies() .AddCaching() .AddMyDependencies() .AddStripeDependencies(); } // 移除无效的Configure方法 }
3. 额外配置说明
若需配置Functions的特定功能(如自定义中间件、JobHost选项),可通过ConfigureFunctionsWorkerDefaults的重载实现:
.ConfigureFunctionsWorkerDefaults(builder => { // 添加自定义中间件 builder.UseMiddleware<CustomMiddleware>(); // 配置JobHost选项 builder.Services.Configure<JobHostOptions>(options => { // 例如禁用自动扫描函数 // options.DisableFunctionDiscovery = false; }); })
内容的提问来源于stack exchange,提问作者Rod Johnson
相关产品推荐
相关产品推荐

