.Net 5 Azure Function App使用Startup类配置连接字符串与依赖注入问题
问题根源说明
你混淆了ASP.NET Core的托管模型和Azure Function的专属托管模型:
ConfigureWebHostDefaults是ASP.NET Core Web应用的专属配置方法,不适用于Azure Function App,这就是你报错的直接原因- 你已经添加了
[assembly: FunctionsStartup(typeof(Startup))]程序集标记,Azure Function运行时会自动识别这个标记,主动调用Startup类的Configure方法,不需要你在Program.cs中手动关联启动类
解决方案
1. 修正Program.cs代码
删掉冗余的CreateHostBuilder方法和不必要的AspNetCore相关命名空间引用,保留最小配置即可:
using Microsoft.Extensions.Hosting; namespace kpi { public class Program { public static void Main(string[] args) { var host = new HostBuilder() .ConfigureFunctionsWorkerDefaults() .Build(); host.Run(); } } }
2. 优化Startup.cs代码
你原有代码中手动构建ServiceProvider是多余操作,IFunctionsHostBuilder可以直接获取配置对象:
using Microsoft.Azure.Functions.Extensions.DependencyInjection; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; [assembly: FunctionsStartup(typeof(Startup))] namespace kpi { public class Startup : FunctionsStartup { public override void Configure(IFunctionsHostBuilder builder) { // 直接从上下文获取配置,无需手动构建服务提供者 var configuration = builder.GetContext().Configuration; // 绑定配置节点 var appSettingsSection = configuration.GetSection("AppSetting"); builder.Services.Configure<AppSetting>(appSettingsSection); var appSettings = appSettingsSection.Get<AppSetting>(); RuntimeConfig.appsettings = appSettings; // 注入数据库上下文 var connectionString = appSettings.AppDBConnection; builder.Services.AddDbContext<ShardingDbContext>(options => options.UseSqlServer(connectionString), ServiceLifetime.Transient); // 其他自定义服务依赖注入可以在此处添加 } } }
3. 确认配置项存在
- 本地开发时请确保
local.settings.json中存在对应的配置节点,示例结构:
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "你的Azure存储连接字符串", "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated", "AppSetting:AppDBConnection": "你的SQL Server数据库连接字符串" } }
- 部署到Azure后,直接在Function App的「配置」-「应用程序设置」中添加对应键值对即可。
前置依赖检查
必须提前安装匹配版本的Nuget包:
Microsoft.Azure.Functions.Extensions.DependencyInjection:提供Function依赖注入的基础能力- 隔离工作者模型还需要安装
Microsoft.Azure.Functions.Worker系列基础包
配置完成后你可以直接在Function类的构造函数中注入IOptions<AppSetting>或者ShardingDbContext,能正常获取实例即代表配置生效。
内容的提问来源于stack exchange,提问作者Md Aslam
相关产品推荐
相关产品推荐

