.NET Core 3.1 Azure Functions项目如何配置中间件并注入依赖服务
.NET Core 3.1 对应的 Azure Functions 运行时为 v3 版本,默认采用进程内托管模型,没有直接暴露和常规 ASP.NET Core 一致的 IApplicationBuilder 配置入口,可通过以下两种方案实现同等中间件能力:
方案1:使用原生函数过滤器(适配所有触发器类型)
函数过滤器是 Azure Functions 原生提供的类中间件能力,支持全局、类、方法级别的执行拦截,可覆盖函数执行前后、异常捕获等全场景,完全可以承载第三方服务的中间件逻辑:
- 自定义过滤器封装中间件逻辑
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(); } }
- 在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
相关产品推荐
相关产品推荐

