繁体   English   中英

如何在Microsoft Azure Functions中将DocumentDB数据库输入绑定与服务总线触发器绑定和BrokeredMessage一起使用?

How do I use a DocumentDB database input binding with a Service Bus trigger binding and BrokeredMessage in Microsoft Azure Functions?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在编写一个简单的函数,当新消息进入服务总线队列时将触发该函数。 该功能的输入是一个DocumentDB文档。 我需要访问文档中的值并将其键入控制台日志中。

创建服务总线队列触发器绑定时,将自动按以下方式创建它:

public static void Run(string myQueueItem, TraceWriter log)
{
    log.Info($"C# ServiceBus queue trigger function processed message: {myQueueItem}");
}

现在,根据此页面 ,可以访问我数据库中的正确文档,可以设置绑定,以便从队列消息中获取文档ID:

id支持类似于{queueTrigger}的绑定,该绑定使用队列消息的字符串值作为文档ID。

这意味着您可以将消息发送到队列,然后像这样绑定到您的文档:

{
    "name": "inputDocument",
    "type": "documentDB",
    "databaseName": "MyDatabase",
    "collectionName": "MyCollection",
    "id" : "{myQueueItem}",//<<<
    "connection": "MyAccount_DOCUMENTDB",     
    "direction": "in"
}

到目前为止,一切似乎都按预期进行。 但是,为了将消息发送到服务总线队列,您必须将其作为BrokeredMessage类型( link )发送。 并且当您这样做时,您将无法再以字符串形式访问消息,从而使自动创建的函数无效。

可以通过以下方式使用BrokeredMessages:

project.json:

{
    "frameworks": {
        "net46":{
            "dependencies": {
                "WindowsAzure.ServiceBus": "2.7.6"
            }
        }
    }
}

run.csx:

using Microsoft.ServiceBus.Messaging;
....
log.Info($"C# ID: {queueItem.GetBody<string>()})

但是我还无法找出如何将{queueItem.GetBody<string>()}传递到输入文档绑定的id属性中。 因此,我不能再使用上述通过"id" : "{myQueueItem}"绑定documentdb输入的方法,因此无法从任何文档读取任何值。

  • 有没有一种方法可以将原始字符串发送到总线队列,或者BrokeredMessage确实是唯一的可能性? (根据我的发现,不可能使用原始字符串)

  • 如果BrokeredMessage确实是唯一的方法,是否仍然可以从消息中获取字符串值并将其用作DocumentDB文档的ID?

  • 如果以上两种方法均不可行,您能否以此为我指出正确的方向?

我的功能的更完整说明:

应用程序会定期将新文档发送到DocumentDB数据库中。 它与文档一起(在等待插入完成之后)将一条带有新文档ID的消息发送到服务总线队列中。 然后触发器将连接到新文档并检查其中的整数值。 如果该值大于10,它将发送有关它的电子邮件通知。

我已经成功创建了该文件,并通过基于Web的编辑器手册Run(使用其中一个文档的字符串ID作为测试输入)对其进行了测试。 但是,当我尝试将其与自动发送文档和消息的应用程序一起使用时,如上所述,我遇到了BrokeredMessage问题。

以下是不带BrokeredMessage的wórking函数的完整代码:

using System;
using System.Net;
using System.Net.Mail;

public static void Run(string queueItem, dynamic inputDocument, TraceWriter log)
{
    log.Info($"C# ID: {queueItem}, Value: {inputDocument.Value}");

    if (inputDocument.Value > 10)
    {
        var fromAddress = new MailAddress("---@gmail.com", "From ---");
        var toAddress = new MailAddress("---@gmail.com", "To ---");
        const string fromPassword = "---";
        const string subject = "Notification";
        const string body = "Temperature too high!";

        var smtp = new SmtpClient
        {
            Host = "smtp.gmail.com",
            Port = 587,
            EnableSsl = true,
            DeliveryMethod = SmtpDeliveryMethod.Network,
            UseDefaultCredentials = false,
            Credentials = new NetworkCredential(fromAddress.Address, fromPassword)
        };
        using (var message = new MailMessage(fromAddress, toAddress)
        {
            Subject = subject,
            Body = body
        })
        {
            smtp.Send(message);
        }
    }
}
1 个回复

这是一个工作示例,显示了如何以POCO形式接收ServiceBus消息并绑定到其属性。

如果您使用正确的application/json内容类型将消息发送到队列,该函数将为您反序列化到POCO中,并且Document DB输入绑定将绑定到DocumentId属性并为您检索文档。 您无需在project.json中添加任何内容即可正常工作。

function.json文件:

{
  "bindings": [
    {
      "name": "input",
      "type": "serviceBusTrigger",
      "direction": "in",
      "queueName": "<your-queue.",
      "connection": "<your-connection>",
      "accessRights": "Manage"
    },
    {
      "type": "documentDB",
      "name": "document",
      "databaseName": "<your-db>",
      "collectionName": "<your-collection>",
      "id": "{DocumentId}",
      "connection": "<your-connection>",
      "direction": "in"
    }
  ]
}

功能代码:

using System;
using System.Threading.Tasks;

public class Input
{
    public string DocumentId { get; set; }
    public int Value { get; set; }
}

public static void Run(Input input, dynamic document, TraceWriter log)
{
    log.Info($"Message received (DocumentId: {input.DocumentId}, Value {input.Value})");
    log.Info($"Document read {document.id}");
}

对于C#函数,要使用绑定参数(例如{DocumentId}参数),必须将触发器输入绑定到定义这些属性的POCO对象。

对于发送电子邮件,您还可以查看我们的SendGrid输出绑定。 我们在门户网站的“示例”下有完整的示例“ SendGrid-CSharp” :)

7 Azure功能Service Bus输出绑定

今天,我将VS 2017更新到版本15.3(最新版本)。 我还安装了Azure函数扩展(适用于Azure函数的Visual Studio 2017工具)和Microsoft.NET.Sdk.Functions-版本1.0.0。 在更新之前,我使用的是15.3预览版和带有安装包Microsof ...

8 Azure服务总线BrokeredMessage的序列化

我有一个无状态的RESTful服务,它将窥视和锁定Azure Service Bus队列。 收到消息后,它将把消息转发给处理消息的客户端。 客户端可能花费比锁定超时更长的时间来处理消息。 客户端无法直接与队列对话,我希望不向服务添加任何状态。 相反,我想向客户端发送足够的信息,以便他 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM