【问题标题】:Intermittent 501 response from InvokeDeviceMethodAsync - Azure IoT来自 InvokeDeviceMethodAsync 的间歇性 501 响应 - Azure IoT
【发布时间】:2021-07-22 16:24:37
【问题描述】:

InvokeDeviceMethodAsync 在响应中间歇性地(并且只是最近)返回状态代码 501(响应正文为空)。

我理解这意味着未实施。但是,该方法已实现 - 事实上,它是唯一的方法。该设备正在使用Microsoft.Azure.Devices.Client(1.32.0-preview-001,因为我们也在预览设备流功能)。

设置,设备端

这都是在启动时调用的。在此之后,一些调用成功,一些失败。

var deviceClient = DeviceClient.CreateFromConnectionString(connectionDetails.ConnectionString, TransportType.Mqtt);

await deviceClient.SetMethodHandlerAsync("RedactedMethodName", RedactedMethodHandler, myObj, cancel).ConfigureAwait(true);

调用,服务器端

var methodInvocation = new CloudToDeviceMethod("RedactedMethodName")
{
  ResponseTimeout = TimeSpan.FromSeconds(60),
  ConnectionTimeout = TimeSpan.FromSeconds(60)
};

var invokeResponse = await _serviceClient.InvokeDeviceMethodAsync(iotHubDeviceId, methodInvocation, CancellationToken.None);

我尝试了什么?

  • 校验码,方法注册
  • 查找有关 501 的文档:找不到任何文档
  • 查看库的源代码 (https://github.com/Azure/azure-iot-sdk-csharp/search?q=501)。只是看起来像“未实施”,即没有任何注册
  • 从 Azure 门户启用分布式跟踪,采样率为 100%。等了很久,还是提示“设备未与所需设置同步”
  • 在DeviceClient 对象上探索智能感知。没有多少!

下一步是什么?

嗯,我想诊断一下。

  • 501 响应有哪些可能的原因?
  • 是否有诊断工具,例如记录,我可以访问吗?

【问题讨论】:

  • 奖励:我刚刚尝试使用 Azure 门户调用该方法。第一个以 501 失败,第二个(一秒钟后)以 200 成功
  • 看看我在stackoverflow.com/questions/56631201/… 中的回答,也可以帮助您解决问题以找出问题的一面等。Azure IoT Hub 测试仪可以很好地帮助您(包括设备流功能):codeproject.com/Articles/1173356/Azure-IoT-Hub-Tester
  • 我的 GitHub 问题中的更多更新:github.com/Azure/azure-iot-sdk-csharp/issues/2122 另外:我设置的 Log Analytics 工作区显示一切正常,直到我们使用了设备流。然后,有时,我们会通过 ConnectionForcefullyClosedOnNewConnection (400027) 获得新连接和断开连接的良好循环。我可以验证我们没有再次运行 DeviceClient.CreateFromConnectionString,也没有再次运行 SetMethodHandlerAsync,也没有使用/创建不同的 DeviceClient。只有一个实例在运行。
  • 您能否使用 TransportType.Amqp 验证此问题?
  • 你确定,你的方法处理程序没有抛出异常,包括检查响应负载中的 json 格式文本吗?

标签: azure azure-iot-hub


【解决方案1】:

看起来,responseTimeoutInSeconds 值内的方法没有响应,因此出于测试目的(以及真正的响应错误)尝试使用REST API 来调用设备方法。

您应该会收到描述为here 的http 状态代码。

【讨论】:

  • 谢谢,但事实并非如此。我立即得到回应。不幸的是,您链接的文档没有评论 501 响应代码。
  • 您是否尝试使用 REST 调用设备方法?在这种情况下,响应 http 状态码是什么?是 501 吗?
  • 还有一点,方法名区分大小写。如果名称不匹配,立即sdk response http status code = 501。因为方法没有实现。
  • 是的,我做到了,请参阅我的评论。外壳是正确的。它间歇性地发生,我没有更换外壳。
  • 有趣,注意,设备流订阅主题 $iothub/streams/POST# 和设备方法订阅 $iothub/methods/POST /#,所以这是两个不同的设备处理程序。我已经在我的 Azure IoT Hub 测试器 中使用 MQTT 直接协议实现了设备流功能,并且对于我所在的地区,美国中部运行良好,彼此之间没有任何影响,换句话说,我无法复制您的问题。我建议出于测试目的使用此测试器(它不使用任何 azure SDK)作为您的终端(设备或云)的模拟器。
猜你喜欢
  • 2014-07-26
  • 1970-01-01
  • 2011-01-28
  • 1970-01-01
  • 1970-01-01
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
相关资源
最近更新 更多