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中提供(沒有看到此文檔)。記錄的輸入如果沒有找到,則似乎爲空。我不確定這將如何工作來創建它,但輸入綁定似乎很好。