• 【Azure Relay】记录使用Azure Relay在通信中遇见侦听器(Listener)或发送端(Sender)断开时的异常日志 (Hybrid Connection by Websocket)


    问题描述

    使用Azure Relay服务,可以帮助服务器与客户端无法直接访问的情况下,提供牵线搭桥中转的沟通方式,俗称“中继”。

    它是一种单对单的通信方式,需要对服务端和客户端代码有一些改动才可以,需要定义服务端侦听器(Listener)来接受消息,客户端(Caller)来发送消息。

    • 服务端侦听器(Listener): 使用 HybridConnectionListener 对象来初始化对象
    • 客户端发送者(Caller):使用 HybridConnectionClient 对象来初始化对象

    image

     

    Azure Relay的工作原理如下

    原理图:

    Processing of Incoming WCF Relay Requests

    流程说明:

    1. Listening client sends a listening request to the Azure Relay service. The Azure load balancer routes the request to one of the gateway nodes.
    2. The Azure Relay service creates a relay in the gateway store.
    3. Sending client sends a request to connect to the listening service.
    4. The gateway that receives the request looks up for the relay in the gateway store.
    5. The gateway forwards the connection request to the right gateway mentioned in the gateway store.
    6. The gateway sends a request to the listening client for it to create a temporary channel to the gateway node that's closest to the sending client.
    7. The listening client creates a temporary channel to the gateway that's closest to the sending client. Now that the connection is established between clients via a gateway, the clients can exchange messages with each other.
    8. The gateway forwards any messages from the listening client to the sending client.
    9. The gateway forwards any messages from the sending client to the listening client.

    基于以上的理解,当Listener 或 Caller 都突然中断的时候, Listener端会记录什么异常日志呢?Caller端会记录什么异常日志呢?

     

    问题解答

    第一部分:Caller端异常退出的情况, Listener会记录什么日志呢?

    结果

    在Listener的日志中,会输出如下的错误消息。

    如果不对异常进行处理,会导致整个进程奔溃,Listener退出。

    复制代码
    Exception in processing connection: 
    Microsoft.Azure.Relay.RelayException: The remote party closed the WebSocket connection without completing the close handshake.
    TrackingId:xxx-xx-xx-xx-xxxx4_G8_G9,
    Address:sb://xxxxxxxx.servicebus.chinacloudapi.cn/xxxxxxxt01,
    Timestamp:5/17/2026 8:48:56 AM

    ---> System.Net.WebSockets.WebSocketException: The remote party closed the WebSocket connection without completing the close handshake. at System.Net.WebSockets.WebSocketBase.WebSocketOperation.d__19.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Net.WebSockets.WebSocketBase.d__45.MoveNext() --- End of stack trace from previous location where exception was thrown ---
    复制代码

    实验

    分别启动Listener 和 Caller,在正常通信两次后,直接关闭Caller窗口

     

    image

     

    第二部分:Listener端异常退出的情况, Caller会记录什么日志呢?

    结果

    在Caller的日志中,会输出如下的错误消息。

    复制代码
    Microsoft.Azure.Relay.RelayException: 
    The remote party closed the WebSocket connection without completing the close handshake.
    TrackingId:xxxx-x-x-xx-xxxx5e79e2e,
    Address:sb://xxxxxx.servicebus.chinacloudapi.cn/xxxxxxst01, Timestamp:5/17/2026 9:29:11 AM
    ---> System.Net.WebSockets.WebSocketException: The remote party closed the WebSocket connection without completing the close handshake. at System.Net.WebSockets.WebSocketBase.WebSocketOperation.d__19.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Net.WebSockets.WebSocketBase.d__45.MoveNext()
    复制代码

    实验

    分别启动Listener 和 Caller,在正常通信后,直接关闭Listener窗口

    image

    对比两种情况下的日志,都是 Microsoft.Azure.Relay.RelayException: The remote party closed the WebSocket connection without completing the close handshake. 

     

    微小的区别在异常消息中的TrackingId格式不同:

    • 如果是Caller异常断开,TrackingId中会携带 _GX_GX 标识,比如: TrackingId:xxx-xx-xx-xx-xxxx4_G8_G9 
    • 如果是Listener异常断开,TrackingId中不会携带,它的值就是普通的guid字符串,如TrackingId:xxx-xx-xx-xx-xxxxxx0a5

    以上内容,供您参考。

     

    参考资料

    什么是 Azure 中继?https://docs.azure.cn/zh-cn/azure-relay/relay-what-is-it

    开始在 .NET 中使用中继混合连接 WebSocket : https://docs.azure.cn/zh-cn/azure-relay/relay-hybrid-connections-dotnet-get-started

     

  • 相关阅读:
    并查集专题
    python安装源码包
    【Python】-- 集合的常用方法
    PostgreSQL查看数据库的创建时间
    apache 组件下载地址
    入门电机系列之3舵机
    强势借力Arbitrum,看代币ARC如何大放异彩
    图像的表示与通道数问题、读取并展示图片、cv2.imread(filename, flags=None)
    我决定把一个收费视频课全免费公开了,今天起,慢慢放出“人人都需要的产品思维课”...
    Tomcat 启动闪退问题解决集(八大类详细)
  • 原文地址:https://www.cnblogs.com/lulight/p/20064536