【问题标题】:How to debug ServiceBus-triggered Azure Function locally?如何在本地调试 ServiceBus 触发的 Azure Function?
【发布时间】:2018-02-06 17:06:54
【问题描述】:

我的函数将从现有的 ServiceBus 主题触发。我已经使用 VS2017 (15.3) 预览版中的新工具创建了该函数,作为编译函数。

如何在本地测试这个功能?

【问题讨论】:

  • 按 F5 并向您的服务总线主题发送消息
  • :-) 是的。我知道这种可能性。但是在函数的上下文中是否有一种简单的方法可以做到这一点?也就是说,重复使用设置,也许每次我开始调试时都这样做?
  • 如果您希望它在启动时添加消息,您可以考虑为您的应用添加一个额外的计时器触发功能,该功能会在短时间内自动将消息放入服务总线以方便调试。
  • 是一个触发函数,所以在调试的时候,预计函数会被事件触发。除了建议的选项之外,另一个选项是使用工具(SBExplorer、ServiceBus360、Cloud Explorer 等)将消息放到队列中。

标签: azure azureservicebus azure-functions azure-servicebus-topics


【解决方案1】:

对于非 http 触发的函数,您可以向本地管理员端点发送 POST 请求。更多信息here

像这样(我正在使用 Postman)

【讨论】:

  • Teomat,您是否成功地为服务总线消息触发的功能完成了此操作?我正在尝试做到这一点,并在我的函数调用 BrokeredMessage#GetBody() 以获取消息正文时不断获取 SerializationException。
  • 是的,它奏效了。不要自己序列化它,运行时会为你做。只需在 Run 函数中包含您的字符串参数: Run([ServiceBusTrigger("queuename",......)]string Info, TraceWriter log)
  • 谢谢!我需要做一些额外的操作来使它工作:1)改变触发器签名接受string msg而不是Message msg; 2)为我的测试SB消息做JSON转义,如{ "input": "{ \"testobj\": { \"testprop\": \"testval\"} }"
  • 这应该是公认的答案。为我省去了很多麻烦。谢谢
  • @Ivan,你不需要更改签名,你可以使用 Encoding.UTF8.GetString(message.Body) 来获取你发布的数据。
【解决方案2】:

如果你想检查你的函数是否会被 Azure 服务总线消息触发,你需要拥有一个 Azure 订阅并创建一个服务总线命名空间,因为微软没有像 Azure 存储模拟器那样提供 Azure 服务总线模拟器。

如果您想调试您的函数,您可以创建一个新的控制台应用程序并调用您定义的函数。以下步骤供您参考。

第 1 步,创建控制台应用程序。

第 2 步,将 Project 引用添加到函数项目中。

第 3 步,将 Microsoft.Azure.WebJobs -Version 2.1.0-beta1 包从 NuGet 安装到您的控制台应用程序。

Install-Package Microsoft.Azure.WebJobs -Version 2.1.0-beta1 

第 4 步,使用以下代码调用您的函数。

class Program
{
    static void Main(string[] args)
    {
        Function1.Run("msg1", new MyTraceWriter(TraceLevel.Info));
    }
}

public class MyTraceWriter : TraceWriter
{
    public MyTraceWriter(TraceLevel level) : base(level)
    {

    }

    public override void Trace(TraceEvent traceEvent)
    {
        Console.WriteLine(traceEvent.Message);
    }
}

【讨论】:

    【解决方案3】:

    您在调试模式下运行项目并为消息创建一个 JSON 有效负载,然后您可以以这种格式发布一个完整的 json 对象。

    {
        "input": "<trigger_input>"
    }
    

    例如

    http://localhost:7071/admin/functions/OrderFunction

    然后您可以在函数体中读取消息并获取您发布的 Json。

    Encoding.UTF8.GetString(message.Body)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-04
      • 2018-03-29
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      • 2018-03-17
      • 2022-01-25
      • 2018-08-21
      相关资源
      最近更新 更多