首页 > 解决方案 > 将参数绑定到复杂对象的 Azure-Function eventthub 触发器问题

问题描述

我正在尝试将数据发送到 IoT 中心,IoT 中心将数据发送到流分析,然后再发送到事件中心。将消息输入事件中心后立即触发 Azure 功能。我面临的问题是,当我从 VS Code(向 IoT Hub 发送 D2C 消息)选项发送 10 条消息时。该函数抛出此错误:

将参数绑定到复杂对象(例如“对象”)使用 Json.NET 序列化。1. 将参数类型绑定为 'string' 而不是 'Object' 以获取原始值并避免 JSON 反序列化,或者 2. 将队列负载更改为有效的 json。JSON 解析器失败:解析值时遇到意外字符:路径“”,第 0 行,位置 0。

根据我的调查,此消息指向无效的 json,但事实并非如此。我的 json 是正确且有效的,因为我的函数可以正确解析它。当我开始向上扩展(以更短的间隔发送更多消息)到 IoT 中心时,会出现此问题。我不确定是什么原因造成的。如果消息不正确,那么函数应该为每条消息抛出错误,而不是随机抛出错误。此外,这个异常没有被捕获,因为这发生在我的函数代码之外的天蓝色方面。我function.json的如下:

{
  "scriptFile": "main.py",
  "bindings": [
    {
      "type": "eventHubTrigger",
      "name": "event",
      "direction": "in",
      "eventHubName": "myhubName",
      "connection": "myConnectionString",
      "cardinality": "many",
      "consumerGroup": "$Default"
    }
  ]
}

我不确定我在这个文件中缺少什么?我不想缩小我的 cardinality(one) 选项,因为当前选项是推荐的选项。类似的问题可以在这里看到。在这种情况下,它们可能没有有效的 json,而是一个字符串。虽然在我的情况下它总是 json 所以我不能使用dataType: string属性。

主文件

import logging
import sys
from sys import path
import os
import traceback
import azure.functions as func
from azure.storage.blob import BlockBlobService
import json

def main(event: func.EventHubEvent):
  try:
    # prints the message
    print("*******************************************")
    print(event.iothub_metadata)
    print(event.get_body())

  except:
        # Logs the stack trace to the root level when errors occurs
    logging.error("Unexpected Error: " + traceback.format_exc())
    pass

标签: azureazure-functionsazure-eventhub

解决方案


如前所述here,您需要DefaultType为 EventHubs 触发器属性创建并确保它已在元数据提供程序中注册。

示例代码在这里


推荐阅读