将BrokeredMessage从Postman发送到Azure函数

时间:2019-04-11 11:55:52

标签: c# azure postman azure-functions azureservicebus

我有一个从Azure Service Bus触发的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请求的正文中,以达到第一行的平衡?还是其他?

3 个答案:

答案 0 :(得分:2)

尽管不太关注您提到的文章,但我认为最简单的方法是使用Service Bus Explorer将函数发送消息到函数正在侦听的队列中。

  

通过Service Bus Explorer,用户可以轻松地连接到Service Bus名称空间并管理消息传递实体。该工具提供高级功能,例如导入/导出功能或测试主题,队列,订阅,中继服务,通知中心和事件中心的功能。

Service Bus Explorer

答案 1 :(得分:0)

将等效的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并将其作为参数传递。

答案 2 :(得分:0)

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

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

只要附加的头部和主体存在,它就会获取字符串化的 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 添加到您想通过此插件修改的任何帖子。

enter image description here

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