You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 05:07:40