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

.NET Core 3.1 Azure Functions项目如何配置中间件并注入依赖服务

.NET Core 3.1 对应的 Azure Functions 运行时为 v3 版本,默认采用进程内托管模型,没有直接暴露和常规 ASP.NET Core 一致的 IApplicationBuilder 配置入口,可通过以下两种方案实现同等中间件能力:

方案1:使用原生函数过滤器(适配所有触发器类型)

函数过滤器是 Azure Functions 原生提供的类中间件能力,支持全局、类、方法级别的执行拦截,可覆盖函数执行前后、异常捕获等全场景,完全可以承载第三方服务的中间件逻辑:

  1. 自定义过滤器封装中间件逻辑
public class ExternalServiceFilter : IFunctionInvocationFilter, IOrderedFilter
{
    private readonly IExternalService _externalService;
    // 支持依赖注入,可直接注入你提前注册的外部服务
    public ExternalServiceFilter(IExternalService externalService)
    {
        _externalService = externalService;
    }
    // 调整执行优先级,确保早于业务逻辑执行
    public int Order { get; set; } = int.MinValue;
    public async Task OnInvocationAsync(FunctionInvocationContext context, Func<FunctionInvocationContext, Task> next)
    {
        // 此处写入中间件前置逻辑,对应第三方服务中间件的初始化操作
        _externalService.SetExecutionContext(context);
        
        // 执行后续管道逻辑
        await next(context);
        
        // 此处写入中间件后置逻辑,对应第三方服务中间件的清理操作
        _externalService.ReleaseContext();
    }
}
  1. 在Startup类中注册全局过滤器
public override void Configure(IFunctionsHostBuilder builder)
{
    // 保留你原有服务注册逻辑
    builder.Services.AddSomeExternalService();
    builder.Services.AddSingleton<SomeOtherStuff>(new SomeOtherStuff(config, env_SomeOtherStuff));
    
    // 注册全局过滤器
    builder.Services.AddMvcCore().AddMvcOptions(options =>
    {
        options.Filters.Add<ExternalServiceFilter>();
    });
}

方案2:注册ASP.NET Core层级中间件(仅适配HTTP触发器场景)

如果你需要的中间件强依赖HTTP请求管道,和常规ASP.NET Core中间件逻辑完全对齐,可以通过扩展配置直接获取IApplicationBuilder注册中间件:

public override void Configure(IFunctionsHostBuilder builder)
{
    // 保留原有服务注册逻辑
    builder.Services.AddSomeExternalService();
    builder.Services.AddSingleton<SomeOtherStuff>(new SomeOtherStuff(config, env_SomeOtherStuff));
    // 配置HTTP管道中间件入口
    builder.Services.AddOptions<HttpOptions>()
        .Configure<IEnumerable<IConfigureOptions<IApplicationBuilder>>>((options, configureOptions) =>
        {
            options.ApplicationBuilderConfigurations = configureOptions;
        });
    builder.Services.AddSingleton<IConfigureOptions<IApplicationBuilder>, AppBuilderConfigurator>();
}
// 单独实现管道配置类
internal class AppBuilderConfigurator : IConfigureOptions<IApplicationBuilder>
{
    public void Configure(IApplicationBuilder app)
    {
        // 此处和常规ASP.NET Core用法完全一致,直接注册第三方中间件
        app.UseSomeExternalServiceMiddleware();
    }
}

补充说明

  • 若你使用的是隔离进程模型的Azure Functions,中间件注册逻辑和常规ASP.NET Core完全一致,直接在Program.cs的ConfigureFunctionsWorkerDefaults方法后调用UseMiddleware即可,但隔离进程模型对.NET Core 3.1的支持度有限,优先推荐使用方案1。
  • 进程内模型下的HttpContext和常规ASP.NET Core完全兼容,第三方中间件无需额外适配即可正常运行。

内容的提问来源于stack exchange,提问作者Mana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 19:42:02