使用 StackExchange.Redis 连接到 Azure Redis 缓存时出错

Error connection to Azure Redis Cache using StackExchange.Redis

我正在尝试使用 StackExchange.Redis.StrongName V1.2.1

连接到 Azure Redis 缓存

我的代码如下所示

string redisServer = ConfigManager.GetValue("RedisServer");
redis = ConnectionMultiplexer.Connect(redisServer);
redisDB = redis.GetDatabase();          
var serializedValue = redisDB.StringGet(key);

最后一行总是抛出这个异常

{"Access to the registry key '238' is denied."}

at Microsoft.Win32.RegistryKey.Win32Error(Int32 errorCode, String str) at Microsoft.Win32.RegistryKey.InternalGetValue(String name, Object defaultValue, Boolean doNotExpand, Boolean checkSecurity) at Microsoft.Win32.RegistryKey.GetValue(String name) at System.Diagnostics.PerformanceMonitor.GetData(String item) at System.Diagnostics.PerformanceCounterLib.GetPerformanceData(String item) at System.Diagnostics.PerformanceCounterLib.GetCategorySample(String category) at System.Diagnostics.PerformanceCounterLib.GetCategorySample(String machine, String category) at System.Diagnostics.PerformanceCounter.NextSample() at System.Diagnostics.PerformanceCounter.NextValue() at StackExchange.Redis.PerfCounterHelper.TryGetSystemCPU(Single& value)
at StackExchange.Redis.ConnectionMultiplexer.GetSystemCpuPercent()
at StackExchange.Redis.ConnectionMultiplexer.GetThreadPoolAndCPUSummary() at StackExchange.Redis.ExceptionFactory.NoConnectionAvailable(Boolean includeDetail, RedisCommand command, Message message, ServerEndPoint server, ServerEndPoint[] serverSnapshot) at StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl[T](Message message, ResultProcessor1 processor, ServerEndPoint server) at StackExchange.Redis.RedisBase.ExecuteSync[T](Message message, ResultProcessor1 processor, ServerEndPoint server) at StackExchange.Redis.RedisDatabase.StringGet(RedisKey key, CommandFlags flags) at CacheManager.Get[T](String key)

相同的代码在使用本地 Redis 缓存服务器时工作得很好。

有什么解决这个问题的建议吗?

根据您的描述,我已经通过引用 Azure Redis 中的 StackExchange.Redis 1.2.1 or StackExchange.Redis.StrongName 1.2.1 到 set/get 键值来创建一个控制台应用程序和一个 Web 应用程序来测试这个问题,这两个应用程序都以 .NET Framework 4.5 为目标缓存,它在我这边可以正常工作。

The same code works just fine when using a local Redis cache server.

根据您的代码,异常是由 IDatabase.StringGet 抛出的,我假设您可以尝试检查您的 Azure Redis 缓存连接字符串并按照官方 tutorial 连接到 Azure Redis 缓存.或者您可以提供更多关于您的场景的详细信息(例如您的托管环境等),我们可以更好地帮助您定位和解决这个问题。

这个调用栈的有趣部分在这里:

StackExchange.Redis.PerfCounterHelper.TryGetSystemCPU(Single& value)

以上代码试图实例化一个 PerformanceCounter 对象,以便它可以查询本地系统的 CPU 使用情况。最后我检查了一下,该代码捕获了所有异常,因为它知道某些环境不允许您创建 PerformanceCounters。该异常不应出现在您的应用程序中。如果该异常冒泡到您的应用程序层,那么这将是 StackExchange.Redis 中的回归,应该在那里提交修复。