Description
请确保您已阅读以上注意事项,并勾选下方的确认框。
- 我已经仔细阅读上述内容
- 我已经使用 最新构建 测试过,问题依旧存在。
- 我已经在 Issue Tracker 中找过我要提出的问题,没有找到相同问题的ISSUE。
- 我已知晓并同意,此处仅用于汇报程序中存在的问题。若这个 Issue 是关于其他非程序本身问题,则我的 Issue 可能会被无条件自动关闭或/并锁定。(其它疑问请考虑加入TG群询问或在discussions中提问)
Lagrange项目
OneBot
所使用/依赖的Lagrange项目对应的commit
运行环境
Windows
运行架构
x64
连接方式
反向 WebSocket
重现步骤
测试过程中,设置了ReconnectInterval是默认值5000,HeartBeatInterval的值设置是 60000 (心跳包不想太频繁,设置成了1分钟) 完整配置如下:{ "$schema": "https://raw.githubusercontent.com/LagrangeDev/Lagrange.Core/master/Lagrange.OneBot/Resources/appsettings_schema.json", "Logging": { "LogLevel": { "Default": "Trace", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "SignServerUrl": "", "SignProxyUrl": "", "MusicSignServerUrl": "", "Account": { "Uin": 0, "Protocol": "Linux", "AutoReconnect": true, "GetOptimumServer": true }, "Message": { "IgnoreSelf": true, "StringPost": false }, "QrCode": { "ConsoleCompatibilityMode": false }, "Implementations": [ { "Type": "ReverseWebSocket", "Host": "127.0.0.1", "Port": 3201, "Suffix": "/ttbot", "ReconnectInterval": 5000, "HeartBeatInterval": 60000, "AccessToken": "" } ] }
现在的问题是,如果直接关闭websocket服务器,设置的ReconnectInterval 间隔不生效,而是要等 HeartBeatInterval周期到后,才会重新连接。而不是期望的断开连接后根据设置的ReconnectInterval周期进行连接。
期望的结果是什么?
反向websocket连接的时候,websocket关闭或重启后,Lagrange.OneBot 能在设置的ReconnectInterval 周期里重新连接。而不是要和心跳包有关联,等心跳包周期后,才进行重新连接。
实际的结果是什么?
现在的问题是,如果直接关闭或重启websocket服务器,设置的ReconnectInterval 间隔不生效,不是在5秒后自动重新连接websocket服务,而是要等 HeartBeatInterval周期到后,才会重新连接。
简单的复现代码/链接(可选)
websocket 服务器测试代码:
import { WebSocketServer } from 'ws';
import { createServer } from 'http';
const server = createServer();
const wss = new WebSocketServer({ server, path: '/ttbot' });
wss.on('connection', (ws, req) => {
console.log(`新的客户端连接来自: ${req.socket.remoteAddress}`);
ws.on('message', (data) => {
console.log('收到消息:', data.toString());
});
ws.on('error', (error) => {
console.error('连接错误:', error);
});
ws.on('close', () => {
console.log('客户端断开连接');
});
});
server.listen(3201, '127.0.0.1', () => {
console.log('WebSocket服务器已在 ws://127.0.0.1:3201/ttbot 启动');
});
Trace 级别日志记录(可选)
日志如下:
trce: Lagrange.Core.BotContext[0]
[2025-06-14 11:41:27] [ServiceContext] [DEBUG]: Outgoing SSOFrame: Heartbeat.Alive
trce: Lagrange.OneBot.Core.Network.Service.ReverseWSService[2]
[ReverseWSService] Send(f2e1a52d-8f19-4c17-b0cb-894c79a59f09): {"interval":60000,"status":{"app_initialized":true,"app_enabled":true,"app_good":true,"online":true,"good":true},"meta_event_type":"heartbeat","time":1749872488,"self_id":670362000,"post_type":"meta_event"}
trce: Lagrange.Core.BotContext[0]
[2025-06-14 11:41:37] [ServiceContext] [DEBUG]: Outgoing SSOFrame: Heartbeat.Alive
trce: Lagrange.Core.BotContext[0]
[2025-06-14 11:41:47] [ServiceContext] [DEBUG]: Outgoing SSOFrame: Heartbeat.Alive
trce: Lagrange.Core.BotContext[0]
[2025-06-14 11:41:57] [ServiceContext] [DEBUG]: Outgoing SSOFrame: Heartbeat.Alive
trce: Lagrange.Core.BotContext[0]
[2025-06-14 11:42:07] [ServiceContext] [DEBUG]: Outgoing SSOFrame: Heartbeat.Alive
trce: Lagrange.Core.BotContext[0]
[2025-06-14 11:42:17] [ServiceContext] [DEBUG]: Outgoing SSOFrame: Heartbeat.Alive
trce: Lagrange.Core.BotContext[0]
[2025-06-14 11:42:27] [ServiceContext] [DEBUG]: Outgoing SSOFrame: Heartbeat.Alive
trce: Lagrange.OneBot.Core.Network.Service.ReverseWSService[2]
[ReverseWSService] Send(f2e1a52d-8f19-4c17-b0cb-894c79a59f09): {"interval":60000,"status":{"app_initialized":true,"app_enabled":true,"app_good":true,"online":true,"good":true},"meta_event_type":"heartbeat","time":1749872548,"self_id":670362000,"post_type":"meta_event"}
warn: Lagrange.OneBot.Core.Network.Service.ReverseWSService[1001]
[ReverseWSService] Disconnect(f2e1a52d-8f19-4c17-b0cb-894c79a59f09)
System.Net.WebSockets.WebSocketException (0x80004005): The remote party closed the WebSocket connection without completing the close handshake.
at System.Net.WebSockets.ManagedWebSocket.ThrowEOFUnexpected()
at System.Net.WebSockets.ManagedWebSocket.EnsureBufferContainsAsync(Int32 minimumRequiredBytes, CancellationToken cancellationToken)
at System.Runtime.CompilerServices.PoolingAsyncValueTaskMethodBuilder`1.StateMachineBox`1.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 token)
at System.Net.WebSockets.ManagedWebSocket.ReceiveAsyncPrivate[TResult](Memory`1 payloadBuffer, CancellationToken cancellationToken)
at System.Runtime.CompilerServices.PoolingAsyncValueTaskMethodBuilder`1.StateMachineBox`1.System.Threading.Tasks.Sources.IValueTaskSource<TResult>.GetResult(Int16 token)
at Lagrange.OneBot.Core.Network.Service.ReverseWSService.ReceiveLoop(ClientWebSocket ws, CancellationToken token)
at Lagrange.OneBot.Core.Network.Service.ReverseWSService.ExecuteAsync(CancellationToken stoppingToken)
warn: Lagrange.OneBot.Core.Network.Service.ReverseWSService[1001]
[ReverseWSService] Disconnect(f2e1a52d-8f19-4c17-b0cb-894c79a59f09)
System.Net.WebSockets.WebSocketException (0x80004005): The server returned status code '400' when status code '101' was expected.
at System.Net.WebSockets.WebSocketHandle.ValidateResponse(HttpResponseMessage response, String secValue)
at System.Net.WebSockets.WebSocketHandle.ConnectAsync(Uri uri, HttpMessageInvoker invoker, CancellationToken cancellationToken, ClientWebSocketOptions options)
at System.Net.WebSockets.ClientWebSocket.ConnectAsyncCore(Uri uri, HttpMessageInvoker invoker, CancellationToken cancellationToken)
at Lagrange.OneBot.Core.Network.Service.ReverseWSService.ExecuteAsync(CancellationToken stoppingToken)
trce: Lagrange.Core.BotContext[0]
[2025-06-14 11:42:37] [ServiceContext] [DEBUG]: Outgoing SSOFrame: Heartbeat.Alive
warn: Lagrange.OneBot.Core.Network.Service.ReverseWSService[1001]
[ReverseWSService] Disconnect(f2e1a52d-8f19-4c17-b0cb-894c79a59f09)
System.Net.WebSockets.WebSocketException (0x80004005): The server returned status code '400' when status code '101' was expected.
at System.Net.WebSockets.WebSocketHandle.ValidateResponse(HttpResponseMessage response, String secValue)
at System.Net.WebSockets.WebSocketHandle.ConnectAsync(Uri uri, HttpMessageInvoker invoker, CancellationToken cancellationToken, ClientWebSocketOptions options)
at System.Net.WebSockets.ClientWebSocket.ConnectAsyncCore(Uri uri, HttpMessageInvoker invoker, CancellationToken cancellationToken)
at Lagrange.OneBot.Core.Network.Service.ReverseWSService.ExecuteAsync(CancellationToken stoppingToken)
trce: Lagrange.Core.BotContext[0]
[2025-06-14 11:42:47] [ServiceContext] [DEBUG]: Outgoing SSOFrame: Heartbeat.Alive
warn: Lagrange.OneBot.Core.Network.Service.ReverseWSService[1001]
[ReverseWSService] Disconnect(f2e1a52d-8f19-4c17-b0cb-894c79a59f09)
System.Net.WebSockets.WebSocketException (0x80004005): The server returned status code '400' when status code '101' was expected.
at System.Net.WebSockets.WebSocketHandle.ValidateResponse(HttpResponseMessage response, String secValue)
at System.Net.WebSockets.WebSocketHandle.ConnectAsync(Uri uri, HttpMessageInvoker invoker, CancellationToken cancellationToken, ClientWebSocketOptions options)
at System.Net.WebSockets.ClientWebSocket.ConnectAsyncCore(Uri uri, HttpMessageInvoker invoker, CancellationToken cancellationToken)
at Lagrange.OneBot.Core.Network.Service.ReverseWSService.ExecuteAsync(CancellationToken stoppingToken)
trce: Lagrange.OneBot.Core.Network.Service.ReverseWSService[1]
[ReverseWSService] Connect(f2e1a52d-8f19-4c17-b0cb-894c79a59f09): ws://127.0.0.1:3201/ttbot
trce: Lagrange.OneBot.Core.Network.Service.ReverseWSService[2]
[ReverseWSService] Send(f2e1a52d-8f19-4c17-b0cb-894c79a59f09): {"sub_type":"connect","meta_event_type":"lifecycle","time":1749872576,"self_id":670362000,"post_type":"meta_event"}
trce: Lagrange.OneBot.Core.Network.Service.ReverseWSService[2]
[ReverseWSService] Send(f2e1a52d-8f19-4c17-b0cb-894c79a59f09): {"interval":60000,"status":{"app_initialized":true,"app_enabled":true,"app_good":true,"online":true,"good":true},"meta_event_type":"heartbeat","time":1749872576,"self_id":670362000,"post_type":"meta_event"}
trce: Lagrange.Core.BotContext[0]
[2025-06-14 11:42:57] [ServiceContext] [DEBUG]: Outgoing SSOFrame: Heartbeat.Alive
trce: Lagrange.OneBot.Core.Network.Service.ReverseWSService[3]
[ReverseWSService] Receive(f2e1a52d-8f19-4c17-b0cb-894c79a59f09): {"action":"get_group_member_list","params":{"group_id":7808920,"no_cache":false},"echo":{"self_id":"670362000","group_id":7808920,"user_id":"","action":"get_group_member_list"}}
trce: Lagrange.OneBot.Core.Network.Service.ReverseWSService[2]
[ReverseWSService] Send(f2e1a52d-8f19-4c17-b0cb-894c79a59f09): {"status":"ok","retcode":0,"data":[{"group_id":7808920,"user_id":123233555,"nickname":"\u2121\u96FE\u5B63\u65E0\u96E8\u2605\u3001","card":"\uD83C\uDF4E\u2121\u96FE\u5B63\u65E0\u96E8\u2605\u3001","sex":"","age":0,"area":"","join_time":1749179905,"last_sent_time":1749532181,"level":"4","role":"member","unfriendly":false,"title":"","title_expire_time":0,"card_changeable":false},{"group_id":7808920,"user_id":583941425,"nickname":"\u5FAE\u5C0F\u5929","card":"\u5FAE\u5C0F\u5929","sex":"","age":0,"area":"","join_time":1525570302,"last_sent_time":1749872463,"level":"9","role":"owner","unfriendly":false,"title":"","title_expire_time":0,"card_changeable":false},{"group_id":7808920,"user_id":670362000,"nickname":"\u5C0F\u5929\u5929\u6D4B\u8BD5","card":null,"sex":"","age":0,"area":"","join_time":1749179835,"last_sent_time":1749872235,"level":"8","role":"member","unfriendly":false,"title":"","title_expire_time":0,"card_changeable":false}],"echo":{"self_id":"670362000","group_id":7808920,"user_id":"","action":"get_group_member_list"}}
trce: Lagrange.Core.BotContext[0]
[2025-06-14 11:43:07] [ServiceContext] [DEBUG]: Outgoing SSOFrame: Heartbeat.Alive
trce: Lagrange.Core.BotContext[0]
[2025-06-14 11:43:17] [ServiceContext] [DEBUG]: Outgoing SSOFrame: Heartbeat.Alive
trce: Lagrange.Core.BotContext[0]
[2025-06-14 11:43:27] [ServiceContext] [DEBUG]: Outgoing SSOFrame: Heartbeat.Alive
trce: Lagrange.Core.BotContext[0]
[2025-06-14 11:43:37] [ServiceContext] [DEBUG]: Outgoing SSOFrame: Heartbeat.Alive
trce: Lagrange.Core.BotContext[0]
[2025-06-14 11:43:43] [ServiceContext] [DEBUG]: Incoming SSOFrame: trpc.msg.olpush.OlPushService.MsgPush
info: Lagrange.Core.BotContext[0]
[2025-06-14 11:43:43] [MessagingLogic] [VERBOSE]: [MessageChain(7808920)(583941425)] [Text]: 测试
trce: Lagrange.OneBot.Core.Network.Service.ReverseWSService[2]
[ReverseWSService] Send(f2e1a52d-8f19-4c17-b0cb-894c79a59f09): {"message_type":"group","sub_type":"normal","message_id":12999296,"group_id":7808920,"user_id":583941425,"anonymous":null,"message":[{"type":"text","data":{"text":"\u6D4B\u8BD5"}}],"raw_message":"\u6D4B\u8BD5","font":0,"sender":{"user_id":583941425,"nickname":"\u5FAE\u5C0F\u5929","card":"\u5FAE\u5C0F\u5929","sex":"unknown","age":0,"area":"","level":"9","role":"owner","title":""},"message_style":{"bubble_id":0,"pendant_id":0,"font_id":0,"font_effect_id":0,"is_cs_font_effect_enabled":false,"bubble_diy_text_id":0},"time":1749872623,"self_id":670362000,"post_type":"message"}
warn: Lagrange.OneBot.Core.Network.LagrangeWebSvcCollection[6]
[LagrangeWebSvcCollection]: WebService send message failed.
System.Net.WebSockets.WebSocketException (0x80004005): The WebSocket is in an invalid state ('Aborted') for this operation. Valid states are: 'Open, CloseReceived'
at System.Net.WebSockets.WebSocketValidate.ThrowIfInvalidState(WebSocketState currentState, Boolean isDisposed, Exception innerException, WebSocketState[] validStates)
at System.Net.WebSockets.ManagedWebSocket.ThrowIfInvalidState(WebSocketState[] validStates)
at System.Net.WebSockets.ManagedWebSocket.SendAsync(ReadOnlyMemory`1 buffer, WebSocketMessageType messageType, WebSocketMessageFlags messageFlags, CancellationToken cancellationToken)
--- End of stack trace from previous location ---
at Lagrange.OneBot.Core.Network.Service.ReverseWSService.SendJsonAsync[T](ClientWebSocket ws, T payload, CancellationToken token)
at Lagrange.OneBot.Core.Network.LagrangeWebSvcCollection.SendJsonAsync[T](T json, String identifier, CancellationToken cancellationToken)
trce: Lagrange.Core.BotContext[0]
[2025-06-14 11:43:47] [ServiceContext] [DEBUG]: Outgoing SSOFrame: Heartbeat.Alive
trce: Lagrange.OneBot.Core.Network.Service.ReverseWSService[2]
[ReverseWSService] Send(f2e1a52d-8f19-4c17-b0cb-894c79a59f09): {"interval":60000,"status":{"app_initialized":true,"app_enabled":true,"app_good":true,"online":true,"good":true},"meta_event_type":"heartbeat","time":1749872636,"self_id":670362000,"post_type":"meta_event"}
warn: Lagrange.OneBot.Core.Network.Service.ReverseWSService[1001]
[ReverseWSService] Disconnect(f2e1a52d-8f19-4c17-b0cb-894c79a59f09)
System.Net.WebSockets.WebSocketException (0x80004005): The remote party closed the WebSocket connection without completing the close handshake.
at System.Net.WebSockets.ManagedWebSocket.ThrowEOFUnexpected()
at System.Net.WebSockets.ManagedWebSocket.EnsureBufferContainsAsync(Int32 minimumRequiredBytes, CancellationToken cancellationToken)
at System.Runtime.CompilerServices.PoolingAsyncValueTaskMethodBuilder`1.StateMachineBox`1.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 token)
at System.Net.WebSockets.ManagedWebSocket.ReceiveAsyncPrivate[TResult](Memory`1 payloadBuffer, CancellationToken cancellationToken)
at System.Runtime.CompilerServices.PoolingAsyncValueTaskMethodBuilder`1.StateMachineBox`1.System.Threading.Tasks.Sources.IValueTaskSource<TResult>.GetResult(Int16 token)
at Lagrange.OneBot.Core.Network.Service.ReverseWSService.ReceiveLoop(ClientWebSocket ws, CancellationToken token)
at Lagrange.OneBot.Core.Network.Service.ReverseWSService.ExecuteAsync(CancellationToken stoppingToken)
trce: Lagrange.Core.BotContext[0]
[2025-06-14 11:43:57] [ServiceContext] [DEBUG]: Outgoing SSOFrame: Heartbeat.Alive
trce: Lagrange.OneBot.Core.Network.Service.ReverseWSService[1]
[ReverseWSService] Connect(f2e1a52d-8f19-4c17-b0cb-894c79a59f09): ws://127.0.0.1:3201/ttbot
trce: Lagrange.OneBot.Core.Network.Service.ReverseWSService[2]
[ReverseWSService] Send(f2e1a52d-8f19-4c17-b0cb-894c79a59f09): {"sub_type":"connect","meta_event_type":"lifecycle","time":1749872641,"self_id":670362000,"post_type":"meta_event"}
trce: Lagrange.OneBot.Core.Network.Service.ReverseWSService[2]
[ReverseWSService] Send(f2e1a52d-8f19-4c17-b0cb-894c79a59f09): {"interval":60000,"status":{"app_initialized":true,"app_enabled":true,"app_good":true,"online":true,"good":true},"meta_event_type":"heartbeat","time":1749872641,"self_id":670362000,"post_type":"meta_event"}
trce: Lagrange.OneBot.Core.Network.Service.ReverseWSService[3]
[ReverseWSService] Receive(f2e1a52d-8f19-4c17-b0cb-894c79a59f09): {"action":"get_group_member_list","params":{"group_id":7808920,"no_cache":false},"echo":{"self_id":"670362000","group_id":7808920,"user_id":"","action":"get_group_member_list"}}
trce: Lagrange.OneBot.Core.Network.Service.ReverseWSService[2]
[ReverseWSService] Send(f2e1a52d-8f19-4c17-b0cb-894c79a59f09): {"status":"ok","retcode":0,"data":[{"group_id":7808920,"user_id":123233555,"nickname":"\u2121\u96FE\u5B63\u65E0\u96E8\u2605\u3001","card":"\uD83C\uDF4E\u2121\u96FE\u5B63\u65E0\u96E8\u2605\u3001","sex":"","age":0,"area":"","join_time":1749179905,"last_sent_time":1749532181,"level":"4","role":"member","unfriendly":false,"title":"","title_expire_time":0,"card_changeable":false},{"group_id":7808920,"user_id":583941425,"nickname":"\u5FAE\u5C0F\u5929","card":"\u5FAE\u5C0F\u5929","sex":"","age":0,"area":"","join_time":1525570302,"last_sent_time":1749872463,"level":"9","role":"owner","unfriendly":false,"title":"","title_expire_time":0,"card_changeable":false},{"group_id":7808920,"user_id":670362000,"nickname":"\u5C0F\u5929\u5929\u6D4B\u8BD5","card":null,"sex":"","age":0,"area":"","join_time":1749179835,"last_sent_time":1749872235,"level":"8","role":"member","unfriendly":false,"title":"","title_expire_time":0,"card_changeable":false}],"echo":{"self_id":"670362000","group_id":7808920,"user_id":"","action":"get_group_member_list"}}
trce: Lagrange.Core.BotContext[0]
[2025-06-14 11:44:07] [ServiceContext] [DEBUG]: Outgoing SSOFrame: Heartbeat.Alive
trce: Lagrange.Core.BotContext[0]
[2025-06-14 11:44:17] [ServiceContext] [DEBUG]: Outgoing SSOFrame: Heartbeat.Alive
trce: Lagrange.Core.BotContext[0]
[2025-06-14 11:44:27] [ServiceContext] [DEBUG]: Outgoing SSOFrame: Heartbeat.Alive
trce: Lagrange.Core.BotContext[0]
[2025-06-14 11:44:37] [ServiceContext] [DEBUG]: Outgoing SSOFrame: Heartbeat.Alive
trce: Lagrange.Core.BotContext[0]
[2025-06-14 11:44:47] [ServiceContext] [DEBUG]: Outgoing SSOFrame: Heartbeat.Alive
trce: Lagrange.Core.BotContext[0]
[2025-06-14 11:44:57] [ServiceContext] [DEBUG]: Outgoing SSOFrame: Heartbeat.Alive
trce: Lagrange.Core.BotContext[0]
[2025-06-14 11:44:58] [ServiceContext] [DEBUG]: Outgoing SSOFrame: trpc.qq_new_tech.status_svc.StatusService.SsoHeartBeat
trce: Lagrange.Core.BotContext[0]
[2025-06-14 11:44:58] [ServiceContext] [DEBUG]: Incoming SSOFrame: trpc.qq_new_tech.status_svc.StatusService.SsoHeartBeat
trce: Lagrange.OneBot.Core.Network.Service.ReverseWSService[2]
[ReverseWSService] Send(f2e1a52d-8f19-4c17-b0cb-894c79a59f09): {"interval":60000,"status":{"app_initialized":true,"app_enabled":true,"app_good":true,"online":true,"good":true},"meta_event_type":"heartbeat","time":1749872701,"self_id":670362000,"post_type":"meta_event"}
trce: Lagrange.Core.BotContext[0]
[2025-06-14 11:45:07] [ServiceContext] [DEBUG]: Outgoing SSOFrame: Heartbeat.Alive
trce: Lagrange.Core.BotContext[0]
[2025-06-14 11:45:17] [ServiceContext] [DEBUG]: Outgoing SSOFrame: Heartbeat.Alive
trce: Lagrange.Core.BotContext[0]
[2025-06-14 11:45:27] [ServiceContext] [DEBUG]: Outgoing SSOFrame: Heartbeat.Alive
trce: Lagrange.Core.BotContext[0]
[2025-06-14 11:45:37] [ServiceContext] [DEBUG]: Outgoing SSOFrame: Heartbeat.Alive
补充说明(可选)
No response