【问题标题】:Send BrokeredMessage from Postman to Azure Function将 BrokeredMessage 从 Postman 发送到 Azure 函数
【发布时间】:2021-07-02 20:20:17
【问题描述】:

我有一个从 Azure 服务总线触发的 Azure 函数。我想在本地测试它并从 Postman 调用我正在运行的 Azure 函数,如下所述:https://docs.microsoft.com/en-us/azure/azure-functions/functions-manually-run-non-http

似乎我设法从 Postman 调用了我的本地 Azure 函数,因为我得到了 202 Accepted 响应。但是在我拨打电话时在控制台中出现错误:

A ScriptHost error has occurred
Exception while executing function: Functions.MyAzFunction. 
Microsoft.Azure.WebJobs.Host: Exception binding parameter 'myBrokeredMessage'.
Microsoft.Azure.WebJobs.ServiceBus: Unable to convert trigger to BrokeredMessage.

当我尝试调试时,它甚至不会停在第一行:

public static async Task Process(BrokeredMessage myBrokeredMessage, Binder binder, TraceWriter log)
{
  var foo = "bar";
  // real code...
}

我应该把什么作为 http 请求的主体,才能到达第一行?还是别的什么?

【问题讨论】:

  • 您使用的是哪个版本,v1 还是 v2? Azure Functions v2 不再使用 BrokeredMessage。
  • 这是版本 1。

标签: c# azure postman azure-functions azureservicebus


【解决方案1】:

虽然没有完全遵循您提到的文章,但我认为使用Service Bus Explorer 将消息发送到您的函数正在侦听的队列来测试您的函数是最简单的。

服务总线资源管理器允许用户连接到服务总线命名空间并以简单的方式管理消息传递实体。该工具提供高级功能,例如导入/导出功能或测试主题、队列、订阅、中继服务、通知中心和事件中心的能力。

【讨论】:

  • 这看起来很有趣,我会试试的。但我的目标是自动化我的测试,看起来像是一个手动测试工具。
  • 自动化测试应该,恕我直言,测试您实现的功能。因此,我不希望它测试基于队列中的消息触发的 Functions 基础结构。测试处理该消息的逻辑(你的逻辑)。通过在你的实现中分离出来,你应该能够很容易地对其进行测试。
  • 是的,这也必须是自动化角度的答案。
  • 是的,我完全同意。我的问题是没有任何单元测试,并且当前代码不可能进行单元测试。所以我想在重构代码和编写单元测试之前先进行几次集成测试。对于那个集成测试,如果我可以通过 REST 调用 Azure 函数会有所帮助。
【解决方案2】:

将等效的 ServiceBus 消息负载序列化为 JSON,并将 JSON 分配给 input 的值(将 JSON 负载作为 input 字段的值时,注意转义双引号)。

假设您在 ServiceBus 消息中传递了一个有效负载类:

class Payload
{
  public string Foo {get;set;}
  public string Bar {get;set;}
}

然后在 Postman 中使用以下内容作为原始请求正文:

{
  "input": "{ 
    \"Foo\": \"test\",
    \"Bar\": \"data\"
  }"
}

我通过实验发现了上述情况(Service Bus Explorer 中的消息文本是 JSON)。后来发现了这个post,它也证实了这种方法——海报引用了source,它提取了input并将其作为参数传递。

【讨论】:

    【解决方案3】:

    另一个需要考虑的选项是 Insomnia 插件,它使用请求挂钩在发送之前修改消息。 AFAIK,Postman 不允许您使用预脚本做类似的事情(除非使用变量) - You cannot modify the request body using pre-scripts

    为了解决我的问题,我创建了一个插件 re-format json body message as a BrokeredMessage,它的功能与上面 camios 描述的完全一样。

    只要附加的 header 和 body 存在,它就会获取字符串化的 json 数据并将其包装在一个新对象中:

    const brokerMessage = {"input": body.text}; // wrap the message as a brokeredMessage payload
    body.text = JSON.stringify(brokerMessage)   // update the request body with the fmt
    context.request.setBody(body);
    

    对于您可能想要发送的给定消息:

    {"eventType":1,"statusType":2,"id":177638636663,"name":"container-ue-1"}
    

    发布的消息变成:

    {"input": "{\"eventType\":1,\"statusType\":2,"id\":177638636663,"name\":\"container-ue-1\"}"}
    

    只需将 plugin 添加到 Insomnia(并启用它),然后将标题 Brokered-Message = true 添加到您希望通过此插件修改的任何帖子。

    这非常适合测试任何本地函数,触发非 http 函数。

    【讨论】:

      猜你喜欢
      • 2019-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-24
      • 1970-01-01
      • 1970-01-01
      • 2021-01-15
      • 1970-01-01
      相关资源
      最近更新 更多