Skip to content

Redis 连不上时别把库写给开发者的建议摆给用户 - #22

Merged
joesdu merged 1 commit into
devfrom
fix/redis-connect-failure-message
Sep 3, 2026
Merged

Redis 连不上时别把库写给开发者的建议摆给用户#22
joesdu merged 1 commit into
devfrom
fix/redis-connect-failure-message

Conversation

@joesdu

@joesdu joesdu commented Sep 3, 2026

Copy link
Copy Markdown
Collaborator

这个 PR 做了什么

连不上时,把 StackExchange.Redis 附在异常消息尾巴上那句写给开发者的建议剪掉,再抛给宿主。

为什么这么改

用户报"本机没起 Redis,点开一条 127.0.0.1:6379 的会话,没有任何提示"。排查下来插件这边是对的 —— RedisWorkspaceProvider.OpenAsync 老老实实抛了 ProtocolConnectionException,静默的原因在宿主(见下面的关联 PR)。

但宿主把提示框补上之后,这条消息就要摆到用户眼前了,而它现在长这样:

连不上 127.0.0.1:6379:It was not possible to connect to the redis server(s).
Error connecting right now. To allow this multiplexer to continue retrying until
it's able to connect, use abortConnect=false in your connection string or
AbortOnConnectFail=false; in your code.

后面那句有两重坏处:

  1. 用户根本没有"连接字符串"可改 —— 这是一个图形客户端,不是一段代码;
  2. 它恰恰是本插件刻意不采纳的做法。AbortOnConnectFail = true 是有理由的(见 RedisConnection.ConnectAsync 的注释):设 false 会让 ConnectAsync 成功返回一个后台重试中的对象,界面于是画出一个空的键树,然后每个操作各自超时 —— 那是最难排查的一种坏。把这句照搬给用户,等于在提示框里教他去要那个结果。

所以在 Describe 这个出口处剪掉。剩下的 It was not possible to connect to the redis server(s). Error connecting right now. 仍然是有用的信息。

改动

  • RedisWorkspaceProvider.Describe:遇到 To allow this multiplexer 就截断。
  • README 的纪律表补两条:首次连接必须大声失败(AbortOnConnectFail = true,以及"宿主不会为一条连不上的连接开标签页,不抛就等于什么都没发生"),不把库写给开发者的建议摆给用户

怎么验证的

  • dotnet build VelaShell.Plugins.slnx —— 零警告零错误
  • dotnet test VelaShell.Plugins.slnx —— 全绿
已通过! - 失败: 0,通过:    24,已跳过:  0,总计:    24 - VelaShell.Plugin.Telnet.Tests.dll
已通过! - 失败: 0,通过:    76,已跳过:  0,总计:    76 - VelaShell.Plugin.Serial.Tests.dll
已通过! - 失败: 0,通过:   102,已跳过:  0,总计:   102 - VelaShell.Plugin.S3.Tests.dll
已通过! - 失败: 0,通过:   153,已跳过: 84,总计:   237 - VelaShell.Plugin.Redis.Tests.dll

(跳过的 84 例是需要本机真有 Redis 的集成用例,按仓库惯例报 Inconclusive。)

新增 RedisWorkspaceProviderTests(2 例),打一个几乎肯定没人监听的高位端口 63799(不用 6379:开发机上它常常是通的,那样用例会在有 Redis 的机器上悄悄失去意义):

用例 守住什么
OpenAsync_WhenNothingIsListening_ThrowsAProtocolConnectionException 握手不通必须,而不是交回一个"连着但其实没连上"的文档;消息里要带端点(同时开几条 Redis 会话时,"连不上"得说清是哪一条)
OpenAsync_StripsTheLibrarysAbortConnectAdvice 消息里不含 abortConnect / AbortOnConnectFail

补充说明

这个 PR 单独合上去也是对的(消息变干净了),但用户看得见提示框,要等宿主那条一起。

关联 PR(一起合)

StackExchange.Redis 在连不上时会在异常消息尾巴上附一句
"…use abortConnect=false in your connection string or AbortOnConnectFail=false; in your code"。
这句话经 ProtocolConnectionException 一路走到宿主的连接失败提示框里,有两重坏处:
用户根本没有"连接字符串"可改,而那恰恰是本插件**刻意不采纳**的做法 ——
设 false 会让 ConnectAsync 成功返回一个后台重试中的对象,界面于是画出一个空键树、
然后每个操作各自超时。所以在出口处剪掉。

补两条纪律进 README:首次连接必须大声失败(AbortOnConnectFail = true),
以及这一条"不把库写给开发者的建议摆给用户"。

新增 RedisWorkspaceProviderTests:死端口必抛 ProtocolConnectionException、
消息里要带端点、且不含 abortConnect —— 宿主不会为一条连不上的连接开标签页,
不抛就等于什么都没发生。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J5gfiQ8G3JfqomjRkuHmPP
@joesdu
joesdu merged commit 72ce7d1 into dev Sep 3, 2026
1 check passed
@joesdu
joesdu deleted the fix/redis-connect-failure-message branch September 3, 2026 09:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant