2

我有一个服务总线队列项BrokeredMessage用了以下机身:Azure的功能绑定参数

{"MemberId":711918,"CampaignId":"214ade86-9167-40ba-a63a-9eeb57f893fa"}

的方法是这样的:

public static async Task Run(BrokeredMessage myQueueItem, CampaignResult inputDocument, TraceWriter log) 

我想看看如果该功能可以使用如下绑定从cosmodb/documentdb中提取文档:

"bindings": [ 
    { 
     "name": "myQueueItem", 
     "type": "serviceBusTrigger", 
     "direction": "in", 
     "queueName": "myqueue", 
     "connection": "myconnectionsb", 
     "accessRights": "Manage" 
    }, 
    { 
     "type": "documentDB", 
     "name": "inputDocument", 
     "databaseName": "pmg-docdb-rd-test", 
     "collectionName": "JobResults", 
     "id": "{CampaignId}-{MemberId}", 
     "connection": "myconnection", 
     "direction": "in" 
    } 
    ], 

我似乎无法将它们放在一起。另外,我不确定如果文档不存在会发生什么,我期望inputDocument为null,但我不确定,想法是如果它不存在,我想创建它如果有更新就更新。由于文档说的任何改变输入文档将坚持我认为更新将工作....

的错误是:名为参数CAMPAIGNID没有价值

总结,我可以具备的功能根据消息检索cosmodb文档,如果文档为空,则创建它,否则更改将持续存在?

编辑:刚才意识到,如果文档不存在,docdb/cosmodb返回404找不到,并且我不认为有任何输入绑定服务总线队列消息,但.....

回答

2

是的,你可以做到这一点,但你需要绑定到一个POCO,以绑定到它的属性。

在你的情况,这将类似于:

public class SomeClass 
{ 
    public string MemberId { get; set; } 
    public string CampaignId { get; set; } 
} 

然后你可以改变你的函数方法把你的POCO,而不是BrokeredMessage为您的触发参数。您的POCO中的属性将成为您可绑定到的命名输入。

+0

我基本上已经与文档数据库,所以我会改变它的队列消息,看看它是否工作。 – lucuma

1

法比奥的帖子帮了我。代理消息必须如下创建:

byte[] bytes = Encoding.UTF8.GetBytes(cr.ToJson()); 
        MemoryStream stream = new MemoryStream(bytes, writable: false); 
        var msg = new BrokeredMessage(stream) 
        { 
         MessageId = "m-" + j + s.MemberID.ToString(), 
         ScheduledEnqueueTimeUtc = schedule, 
         ContentType = "application/json" 
        }; 

而PartitionKey必须在function.json中提供(没有看到此文档)。记录的输入如果没有找到,则似乎为空。我不确定这将如何工作来创建它,但输入绑定似乎很好。