我有一个从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请求的正文中,以达到第一行的平衡?还是其他?
答案 0 :(得分:2)
尽管不太关注您提到的文章,但我认为最简单的方法是使用Service Bus Explorer将函数发送消息到函数正在侦听的队列中。
通过Service Bus Explorer,用户可以轻松地连接到Service Bus名称空间并管理消息传递实体。该工具提供高级功能,例如导入/导出功能或测试主题,队列,订阅,中继服务,通知中心和事件中心的功能。
答案 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 添加到您想通过此插件修改的任何帖子。
这非常适合测试任何本地函数,触发非 http 函数。