我目前正尝试从公司服务器向 Azure 消息队列发送消息,但似乎无法确认 Azure 是否收到了该消息。
没有人使用该消息,因此应将其放置在“死消息队列”中。
我从服务器发送的消息不会增加该计数器。从虚拟机发送的消息会增加计数器吗?
是什么阻碍了这一进程?有什么方法可以调试该问题吗?
我的任何异常都没有被触发。
除此之外,我注意到我的消息被接收在死信队列中而不是活动消息队列中。
没有任何东西在消耗该消息,但是到目前为止我看到的所有 Azure 队列示例都提到应该增加活动消息队列?
该服务器确实具有用于网络访问的代理,但是对于这种类型的连接也应该使用它吗?
这两者有什么区别?
我添加了堆栈跟踪消息:
The process failed: Microsoft.Azure.ServiceBus.ServiceBusCommunicationException: No connection could be made because the target machine actively refused it ErrorCode: ConnectionRefused ---> System.Net.Sockets.SocketException: No connection could be made because the target machine actively refused it
但是我检查连接是否正常isclosed
,总是返回 false。
答案1
从我读过的内容来看,我认为评论中的 Sam Cogan 是对的。我认为您需要打开适当的端口以允许 Service Bus 进行通信。
以下文章列出了开放端口要求:
- Azure 服务总线始终要求使用 TLS。
- 它支持通过 TCP 端口 5671 和 TCP 端口 5672 进行的连接。服务器使用 AMQP 规定的模型立即提供对 TLS 的强制升级。AMQP WebSockets 绑定通过 TCP 端口 443 创建隧道,该隧道等同于 AMQP 5671 连接。
- 现代(.Net Standard 和 Java)客户端均使用 AMQP,因此上述指导适用。
- 较旧的 .NET 库具有自定义的、基于 WCF 的协议,该协议使用 TCP 和端口 9354(称为 SBMP,即服务总线消息传递协议)。
- 如果您仅使用我们的 rest API,您可能只能打开端口 443。
总结
尝试在防火墙上打开出站 TCP 端口 5671、5672,如果不行,请尝试打开端口 9354。
附言
以下是有关如何在防火墙上打开端口的链接:
- Linux:https://www.codero.com/knowledge-base/content/24/431/en/how-to-open-_-close-ports-in-your-firewall-on-linux-iptables-firewalld-ufw.html
- Windows 服务器(像此链接所示,选择出站而不是入站):https://www.vultr.com/docs/how-to-open-a-port-in-windows-firewall-on-windows-server-2012
这里还有关于为什么消息可能会被自动发送到死信队列的原因的链接:
- 标头大小超出
- 异常.GetType().名称
- TTLExpiredException
- 会话 ID 为空。
- 最大传输跳数超出
- 根据应用指定