DocumentDb/CosmoDb 的 Azure 函数绑定参数
Azure Function Binding Parameters for DocumentDb/CosmoDb
我有一个服务总线队列项 BrokeredMessage,正文如下:
{"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 没有值
总而言之,我能否让该函数根据消息检索 cosmdb 文档,如果该文档为空,则会创建它,否则会保留更改?
编辑:刚刚意识到 docdb/cosmodb returns 如果文档不存在则找不到 404,而且我认为服务总线队列消息没有任何输入绑定,然而.....
是的,您可以这样做,但是您需要绑定到 POCO 才能绑定到它的属性。
在您的情况下,这类似于:
public class SomeClass
{
public string MemberId { get; set; }
public string CampaignId { get; set; }
}
然后您可以更改您的函数方法以将您的 POCO 作为触发器的参数,而不是 BrokeredMessage
。您的 POCO 中的属性将成为您可以绑定到的命名输入。
Fabio 的 post 帮助了我。代理消息必须像这样创建:
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"
};
并且必须在 function.json 中提供 PartitionKey(没有看到此记录)。如果找不到,记录的输入似乎为空。我不确定如何创建它,但输入绑定似乎没问题。
我有一个服务总线队列项 BrokeredMessage,正文如下:
{"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 没有值
总而言之,我能否让该函数根据消息检索 cosmdb 文档,如果该文档为空,则会创建它,否则会保留更改?
编辑:刚刚意识到 docdb/cosmodb returns 如果文档不存在则找不到 404,而且我认为服务总线队列消息没有任何输入绑定,然而.....
是的,您可以这样做,但是您需要绑定到 POCO 才能绑定到它的属性。
在您的情况下,这类似于:
public class SomeClass
{
public string MemberId { get; set; }
public string CampaignId { get; set; }
}
然后您可以更改您的函数方法以将您的 POCO 作为触发器的参数,而不是 BrokeredMessage
。您的 POCO 中的属性将成为您可以绑定到的命名输入。
Fabio 的 post 帮助了我。代理消息必须像这样创建:
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"
};
并且必须在 function.json 中提供 PartitionKey(没有看到此记录)。如果找不到,记录的输入似乎为空。我不确定如何创建它,但输入绑定似乎没问题。