如何在独立模式Azure Functions中间件间传递值
Azure Functions Worker中间件间传值方案(HttpTrigger场景)
在Azure Functions Worker中间件中,无法通过修改BindingContext.BindingData传值,推荐以下两种可靠方式:
方案一:利用FunctionContext.Items集合(通用所有触发器)
FunctionContext.Items是一个IDictionary<object, object>类型的集合,专门用于在请求生命周期内的组件间共享数据,支持读写操作。
修改你的中间件代码:
// 定义常量键避免魔法字符串 public static class MiddlewareSharedKeys { public const string CalculatedValue = "CalculatedValue"; } public class MiddlewareA : IFunctionsWorkerMiddleware { public Task Invoke(FunctionContext context, FunctionExecutionDelegate next) { // 计算并设置共享值 var calculatedValue = "这里是MiddlewareA计算出的值"; context.Items[MiddlewareSharedKeys.CalculatedValue] = calculatedValue; return next.Invoke(context); } } public class MiddlewareB : IFunctionsWorkerMiddleware { public Task Invoke(FunctionContext context, FunctionExecutionDelegate next) { // 获取MiddlewareA传递的值 if (context.Items.TryGetValue(MiddlewareSharedKeys.CalculatedValue, out var value)) { var calculatedValue = value.ToString(); // 这里使用获取到的值进行逻辑处理 } return next.Invoke(context); } }
方案二:利用HttpRequestData.Properties集合(仅HttpTrigger)
针对HttpTrigger场景,可以获取请求对象HttpRequestData,它的Properties集合也是一个字典,适合存储Http请求上下文相关的共享数据。
修改代码如下:
public static class MiddlewareSharedKeys { public const string HttpCalculatedValue = "HttpCalculatedValue"; } public class MiddlewareA : IFunctionsWorkerMiddleware { public Task Invoke(FunctionContext context, FunctionExecutionDelegate next) { var httpRequest = context.GetHttpRequestData(); if (httpRequest != null) { // 计算并设置Http请求上下文的共享值 var calculatedValue = "这里是MiddlewareA为Http请求计算的值"; httpRequest.Properties[MiddlewareSharedKeys.HttpCalculatedValue] = calculatedValue; } return next.Invoke(context); } } public class MiddlewareB : IFunctionsWorkerMiddleware { public Task Invoke(FunctionContext context, FunctionExecutionDelegate next) { var httpRequest = context.GetHttpRequestData(); if (httpRequest != null && httpRequest.Properties.TryGetValue(MiddlewareSharedKeys.HttpCalculatedValue, out var value)) { var calculatedValue = value.ToString(); // 这里使用获取到的值进行逻辑处理 } return next.Invoke(context); } }
注意事项
- 两种方案存储的数据仅在当前请求生命周期内有效,请求结束后会被释放,不要存储大对象或需要持久化的数据。
- 使用常量键替代魔法字符串,可避免拼写错误,提升代码可维护性。
- 获取值时务必做空值判断,避免空引用异常。
内容的提问来源于stack exchange,提问作者sa-es-ir
相关产品推荐
相关产品推荐

