使用服务总线触发器在Azure功能上进行本地测试时提供用户属性

时间:2018-07-09 15:55:30

标签: azure azure-functions azure-functions-runtime

使用Service Bus绑定在本地开发Azure Functions时,可以使用HTTP请求向http://localhost:{port}/admin/functions/{function_name}发送请求以测试功能  (请参见https://docs.microsoft.com/en-us/azure/azure-functions/functions-run-local上的非HTTP触发函数)。

在HTTP请求的正文中,可以发送以下内容以填充服务总线消息的正文:

{
    "input": "<trigger_input>"
}

绑定到方法中的message.Body属性: 例如

public class TestServiceBusTrigger
    {
        [FunctionName("test-servicebus-trigger")]
        public static void ProcessQueueMessage([ServiceBusTrigger("inputqueue")] Message message, TextWriter logger)
        {
            logger.WriteLine(message.Body);
        }
    }

如何在示例请求中填充message.UserProperties

当前使用以下版本:

  • Microsoft.Azure.WebJobs 3.0.0-beta5
  • Microsoft.Azure.WebJobs.ServiceBus 3.0.0-beta5
  • Microsoft.NET.Sdk.Functions 1.0.13
  • Azure Functions核心工具 2.0.1-beta.31
  • 函数运行时版本: 2.0.11888.0

3 个答案:

答案 0 :(得分:0)

如您提到的文档所述,

  

消息正文必须具有以下JSON格式{ "input":"<trigger_input>"}

您要实现的是模拟一个包含UserProperties字段的消息对象。显然,Json格式的字符串不符合此条件。在我的测试中,整个trigger_input始终被识别为消息正文。

通常来说(不使用管理端点),我们可以在触发器中声明其他参数以接收metadata。所以我尝试了管理端点,也没有用。看起来函数主机仅接受input命名的字符串,尽管请求正文中有其他参数。

因此管理端点似乎是死胡同。您可以使用this code sample测试服务总线触发。

答案 1 :(得分:0)

如果您是在Visual Studio中进行开发,则可以在一个轻量级外观后面抽象实现,然后对实现进行单元测试。

答案 2 :(得分:0)

admin/functions端点应该接收POST请求,其正文创建如下:

{
  "input": "<your_whole_service_bus_message_serialized>"
}

因此,在发送请求时,您必须先序列化服务总线消息,然后再次序列化input对象包装器。

如果您使用的是CSharp,则POST请求的内容应为:

var content = new StringContent(
   JsonConvert.SerializeObject(new { input = JsonConvert.SerializeObject(sbMessage)}), 
   Encoding.UTF8,
   "application/json"
);

您不需要消息包装对象,并且如果您的函数绑定参数是复杂类型,则可以仅发送序列化类型作为input Json属性的值。