gpt4 book ai didi

.net - 无法使用 StackExchange.Redis 连接到 C# 中的 Azure Redis 缓存(超时错误)

转载 作者:行者123 更新时间:2023-12-03 00:17:44 26 4
gpt4 key购买 nike

我正在将 Azure Redis 缓存(用于开发的 Basic C0)集成到我们的一个 .Net 系统 (.Net 4.6.1) 中,并使用 StackExchange.Redis v2.6.90 客户端库。这一切都在 Windows 环境中运行(10 用于本地开发,Server 2019 Std 用于测试)

我创建了一个基本包装器来为我处理连接:

using System;
using System.Net;
using StackExchange.Redis;

namespace Rimes.Azure
{
public class RedisCache
{
private ConnectionMultiplexer _redis;

private void Initialize(ConfigurationOptions options)
{
// Azure requires TLS 1.2 but .Net uses TLS 1.1 by default
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

_redis = ConnectionMultiplexer.Connect(options);
}

public RedisCache(string endPoint, string token, bool useSsl = true, bool abortOnConnectFail = true)
{
var options = ConfigurationOptions.Parse(endPoint);
options.Password = token;
options.Ssl = useSsl;
options.AbortOnConnectFail = abortOnConnectFail;

Initialize(options);
}

public string Get(string key)
{
IDatabase db = _redis.GetDatabase();
return db.StringGet(key);
}

public bool Set(string key, string value, int timeToLive)
{
IDatabase db = _redis.GetDatabase();
return db.StringSet(key, value, TimeSpan.FromSeconds(timeToLive));
}
}
}

这在我的本地开发机器上完美运行(惊讶!我知道,这些问题之一),具有出色的性能。从测试服务器来看,它根本不起作用 - 唯一的响应是 RedisTimeoutException (获取、设置,我相信还有实例化,考虑到实例化所需的时间):

Exception type: RedisTimeoutException 
Exception message: Timeout performing PSETEX (5000ms), inst: 0, qu: 1, qs: 0, aw: False, bw: SpinningDown, last-in: 0, cur-in: 0, sync-ops: 2, async-ops: 1, serverEndpoint: xxx.redis.cache.windows.net:6380, conn-sec: n/a, mc: 1/1/0, mgr: 10 of 10 available, clientName: xxx(SE.Redis-v2.6.90.64945), IOCP: (Busy=0,Free=1000,Min=12,Max=1000), WORKER: (Busy=2,Free=32765,Min=12,Max=32767), v: 2.6.90.64945 (Please take a look at this article for some common client-side issues that can cause timeouts: https://stackexchange.github.io/StackExchange.Redis/Timeouts)
at StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl[T](Message message, ResultProcessor`1 processor, ServerEndPoint server, T defaultValue)
at Rimes.Azure.RedisCache.Set(String key, String value, TimeSpan expiry)

我已经浏览了错误消息中提供的链接中的建议,并阅读了该地方的大量 Material ,但似乎没有任何有关查找内容的建议对我的情况有效

我尝试过的:

  • 将超时从默认的 5000 毫秒提高到 30000 毫秒 - 没有变化
  • psping,验证与 Azure 的连接 - 成功
  • 检查了本地服务器和 Azure 上的防火墙设置 - Azure 中没有防火墙配置,并且本地服务器配置为允许传出连接
  • 已检查 .Net 版本 - 实际上在两个环境中都运行 4.8。这里唯一的区别似乎是我的本地计算机运行 4.8.04084 和服务器运行 4.8.03761
  • 已与网络团队核实,以确认没有外部因素 - 他们找不到任何东西
  • 使用 redis 3.5.3 库用 Python 重新开发 - 缓存在两台机器上都能完美运行

根据上述内容,我知道这个问题存在于我的 .Net 环境中的某个地方,但我的经验有限,我不确定现在该去哪里解决。我欢迎任何建议!

更新:

我确实在 2 月 14 日星期五在测试服务器上运行了此功能,但在 2 月 17 日星期一却无法运行。环顾四周,我发现了两个针对 .Net 的 MS 安全更新,这些更新是为了修复 14 日的一个关键安全更新而发布的 - KB5022504和KB5022782

删除这些更新没有什么区别,但它确实让我研究了 .Net 更新,并且不同的组策略设置似乎会导致不同的更新实践。在我们的服务器上,我们仅获得安全更新,在我的开发机器上,我仅获得功能更新

更新:

在 Azure Redis 上打开并使用非 SSL 端口是可行的。回拨到 TLS 1.0 也可以。将 TLS 设置为更高的值会失败,并在额外日志记录中显示以下输出:

11:09:02.9964: Allowing 1 endpoint(s) 00:00:05 to respond...
11:09:02.9964: Awaiting 1 available task completion(s) for 5000ms, IOCP: (Busy=0,Free=1000,Min=2,Max=1000), WORKER: (Busy=4,Free=32763,Min=10,Max=32767)
11:09:03.0241: Configuring TLS
11:09:03.0554: Connection failed: xxx.redis.cache.windows.net:6380 (Subscription, AuthenticationFailure): AuthenticationFailure on xxx.redis.cache.windows.net:6380/Subscription, Initializing/NotStarted, last: NONE, origin: ConnectedAsync, outstanding: 0, last-read: 0s ago, last-write: 0s ago, keep-alive: 60s, state: Connecting, mgr: 10 of 10 available, last-heartbeat: never, global: 0s ago, v: 2.6.96.30123
11:09:03.0554: > A call to SSPI failed, see inner exception.
11:09:03.0554: > The function requested is not supported
11:09:03.0554: xxx.redis.cache.windows.net:6380: OnConnectedAsync completed (Disconnected)
...
11:09:03.1178: Endpoint Summary:
11:09:03.1178: xxx.redis.cache.windows.net:6380: Standalone v4.0.0, primary; keep-alive: 00:01:00; int: Disconnected; sub: Disconnected; not in use: DidNotRespond
11:09:03.1178: xxx.redis.cache.windows.net:6380: int ops=0, qu=0, qs=0, qc=0, wr=0, socks=3; sub ops=0, qu=0, qs=0, qc=0, wr=0, socks=3
11:09:03.1178: xxx.redis.cache.windows.net:6380: Circular op-count snapshot; int: 0 (0.00 ops/s; spans 10s); sub: 0 (0.00 ops/s; spans 10s)
11:09:03.1178: Sync timeouts: 0; async timeouts: 0; fire and forget: 0; last heartbeat: -1s ago
11:09:03.1178: Starting heartbeat...
11:09:08.1781: Encountered exception: StackExchange.Redis.RedisTimeoutException: The timeout was reached before the message could be written to the output buffer, and it was not sent, command=SUBSCRIBE, timeout: 5000, inst: 0, qu: 0, qs: 0, aw: False, bw: CheckingForTimeout, rs: NotStarted, ws: Initializing, in: 0, last-in: 0, cur-in: 0, sync-ops: 0, async-ops: 1, serverEndpoint: xxx.redis.cache.windows.net:6380, conn-sec: n/a, mc: 1/1/0, mgr: 10 of 10 available, clientName: LDOKTATEST01(SE.Redis-v2.6.96.30123), IOCP: (Busy=0,Free=1000,Min=2,Max=1000), WORKER: (Busy=6,Free=32761,Min=10,Max=32767), v: 2.6.96.30123 (Please take a look at this article for some common client-side issues that can cause timeouts: https://stackexchange.github.io/StackExchange.Redis/Timeouts)
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebugge

基于配置 TLS 后 SSPI 失败,我决定删除 SecurityProtocol 设置并尝试通过注册表将 .Net 配置为使用 TLS 1.2。 这有效

我现在缺少的是如何在代码中将 TLS 版本设置为 1.2,这样无需设置注册表项即可工作

最佳答案

对于我来说,我使用的是 .NET Framework 4.5.1。将以下内容添加到现有连接字符串可以解决该问题:sslProtocols=tls12。我使用的是 StackExchange.Redis v 1.2.6(当时是 .Net Framework 支持的最新版本)。

此外,请确保您的应用程序使用 TLS 1.2。在 C# 中,可以使用以下代码完成此操作:ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

部署到 Azure 时,请确保资源配置也设置为使用 TLS 1.2。

引用 https://learn.microsoft.com/en-us/azure/azure-cache-for-redis/cache-remove-tls-10-11#net-framework

关于.net - 无法使用 StackExchange.Redis 连接到 C# 中的 Azure Redis 缓存(超时错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75544378/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com