asp.net-core - 为什么 DistributedCache SessionHandler 会抛出连接问题?
问题描述
我有一个 .net 核心应用程序在 azure 的 VM 中运行,我使用 Redis 作为 DistributedCache 的实现。通过这种方式,我们将用户会话存储在 Redis 中,并且可以在网络场中共享。我们只使用 Redis 来存储会话。我们将 Azure Cache for Redis 与普通实例一起使用。VM 和 Redis 都在同一个区域中。
在启动中添加:
services.AddStackExchangeRedisCache(options => {
options.Configuration = configuration["RedisCache:ConnectionString"];
});
在网络应用程序中,我们在 redis 关闭连接时遇到间歇性问题。所有对 Redis 的调用都是通过调用会话异步方法来管理的,如下所示。
public static async Task<T> Get<T>(this ISession session, string key) {
if (!session.IsAvailable)
await session.LoadAsync();
var value = session.GetString(key);
return value == null ? default(T) : JsonConvert.DeserializeObject<T>(value);
}
我们看到的错误是:
StackExchange.Redis.RedisConnectionException: No connection is available to service this operation: EVAL; An existing connection was forcibly closed by the remote host.; IOCP: (Busy=0,Free=1000,Min=2,Max=1000), WORKER: (Busy=3,Free=32764,Min=512,Max=32767), Local-CPU: n/a
---> StackExchange.Redis.RedisConnectionException: SocketFailure on myredis.redis.cache.windows.net:6380/Interactive, Idle/Faulted, last: EVAL, origin: ReadFromPipe, outstanding: 1, last-read: 34s ago, last-write: 0s ago, keep-alive: 60s, state: ConnectedEstablished, mgr: 9 of 10 available, in: 0, last-heartbeat: 0s ago, last-mbeat: 0s ago, global: 0s ago, v: 2.0.593.37019
---> System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host..
和
StackExchange.Redis.RedisConnectionException: SocketFailure on myredis.redis.cache.windows.net:6380/Interactive, Idle/Faulted, last: EXPIRE, origin: ReadFromPipe, outstanding: 1, last-read: 0s ago, last-write: 0s ago, keep-alive: 60s, state: ConnectedEstablished, mgr: 9 of 10 available, in: 0, last-heartbeat: 0s ago, last-mbeat: 0s ago, global: 0s ago, v: 2.0.593.37019
---> System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host..
在超时期间我们没有遇到流量峰值,并且 Redis 实例没有承受任何重负载。
我不知道如何进一步解决这个问题。任何想法?
解决方案
Redis 服务器可能因为空闲时间过长而关闭了连接。在您的 Azure 缓存控件中,您可以找到 Redis 服务器的配置,看看您是否可以找到超时设置。如果可以通过命令行发出命令,也可以发出这个命令
CONFIG get timeout
如果为零,则表示没有超时。
然后问题出在您的 redis 客户端上。我不熟悉.Net,无论您使用什么客户端连接到 Redis 服务器,请检查超时选项或 Google 搜索(客户端名称)+超时,看看是否可以找到任何有用的信息。
推荐阅读
- excel - 基于空白单元格删除非连续范围
- c# - setsimplecolumn 不使用 C# 中的 itextsharp 5 将文本定位到 PDF 中的给定坐标
- sql - SQL 查询以动态追加具有计算值的列
- sql-server - 需要帮助来计算单列
- javascript - 使用javascript单击按钮后如何更改视频源
- flutter - 如何使 Flutter 应用程序字体响应平板电脑?
- html - 我的输入字段必填选项不起作用
- python - Python:if 语句中的行级计算
- java - AppEngine Java Google Cloud 解析依赖项
- python - 将带有字符串的json文件加载到python中的pandas数据框中