隔离模式Azure函数多输出绑定如何引用触发器属性
问题
运行采用隔离进程模式的C# Azure Function时,尝试在[BlobOutput]绑定中复用触发器消息的BlobFileName属性(来自BusMessage类的计算属性),但运行时报错:No value for named parameter 'BlobFileName'。
原函数及相关类代码如下:
函数代码
[Function("MyFunction")] public AggregateResponse Run( [ServiceBusTrigger("topic", "subscription", Connection = "ServiceBusConnection")] BusMessage busMsg, [BlobInput("input/{BlobName}", Connection = "StorageConnection")] byte[] blob ) { // 处理逻辑 return new() { OutputBlob = outputBlob, QueueMessage = new($"{busMsg.BlobFileName}.json") }; }
相关类定义
// 触发器消息POCO public class BusMessage { public string BlobName { get; set; } = null!; public string BlobFileName => Path.GetFileNameWithoutExtension(BlobName); } // 队列输出Record public record QueueMessage(string StoragePath); // 多输出绑定类 public class AggregateResponse { [BlobOutput("json/{BlobFileName}.json", Connection = "StorageConnection")] public object OutputBlob { get; set; } = null!; [ServiceBusOutput("queue", ServiceBusEntityType.Queue, Connection = "ServiceBusConnection")] public QueueMessage QueueMessage { get; set; } = null!; }
解决方案
报错原因是Azure Functions隔离进程模式的绑定引擎无法直接在输出绑定表达式中引用触发器对象的计算属性(BlobFileName是无setter的只读属性),同时原AggregateResponse类中也没有提供BlobFileName属性供绑定引擎读取。可以通过以下两种方式解决:
方法一:在输出响应类中添加对应属性
修改AggregateResponse类,新增BlobFileName属性,在函数返回时从触发器对象赋值:
public class AggregateResponse { // 新增属性,供绑定表达式引用 public string BlobFileName { get; set; } = null!; [BlobOutput("json/{BlobFileName}.json", Connection = "StorageConnection")] public object OutputBlob { get; set; } = null!; [ServiceBusOutput("queue", ServiceBusEntityType.Queue, Connection = "ServiceBusConnection")] public QueueMessage QueueMessage { get; set; } = null!; }
然后在函数的返回逻辑中赋值:
return new() { BlobFileName = busMsg.BlobFileName, OutputBlob = outputBlob, QueueMessage = new($"{busMsg.BlobFileName}.json") };
方法二:直接引用触发器参数的属性
隔离进程模式支持在输出绑定表达式中直接引用触发器参数的属性(需确保参数名称和属性名称正确),修改BlobOutput的绑定表达式为:
[BlobOutput("json/{busMsg.BlobFileName}.json", Connection = "StorageConnection")] public object OutputBlob { get; set; } = null!;
这种方式无需修改AggregateResponse类,绑定引擎会直接从触发器参数busMsg中读取BlobFileName属性值。
内容的提问来源于stack exchange,提问作者Carl Heinrich Hancke
相关产品推荐
相关产品推荐

