我正在测试在调用 Mqttnet 的
PublishAsync()
到一个不好的主题(例如“####”)时的错误处理,但我遇到了意外的行为。
预期: 我期望
PublishAsync()
返回一个 MqttClientPublishResult
实例,其中 ReasonCode
具有值 MqttClientPublishReasonCode.TopicNameInvalid
。
实际: 相反,我遇到了异常:
MQTTnet.Exceptions.MqttProtocolViolationException: 'The character '#' is not allowed in topics.'
这是相当不幸的,因为使用
MqttClientPublishReasonCode
中的特定 MqttClientPublishResult
值将有助于我的错误处理。有没有办法在方法不抛出错误的情况下接收这个结果对象?
我尝试使用
MqttClientOptionsBuilder
及其方法 WithRequestProblemInformation()
和 WithRequestResponseInformation()
实例化我的客户端,但仍然抛出错误。我知道通过调用 PingAsync()
可以解决此问题,但我找不到 TryPingAsync()
的类似替代方案。谢谢你。
PublishAsync()
是通配符,因此您的主题不符合规范。发生这种情况时,MQTT 服务器应断开网络连接(使用 v5,您可能会收到“格式错误的数据包”原因代码)。
#
原因代码144(“主题名称无效”),您在问题中提到,
用于当“主题名称格式正确,但不被此客户端或服务器接受。”。所以它不适用于这种情况(因为主题格式错误)。 MQTTNet 的作者有两个主要选择,发送
PUBACK
(意味着服务器断开连接)或引发异常。虽然发送数据包可能是一种有效的方法,但它可能会导致令人困惑的问题(例如,每次连接建立时重新发送数据包时会出现断开/重新连接循环)。
如果您查看here,您可以看到主题无效时引发的各种异常。处理 PUBLISH
异常不应使事情变得太复杂,更好的选择可能是验证配置/用户输入,以避免首先使用此类主题。