StackExchange.Redis не может выполнять запись или чтение с локального сервера Redis при развертывании приложения asp.Net Mvc в IIS 8.5 на Windows Server 2012 R2
У меня есть приложение asp.net mvc, которое работает на платформе.Net 4.6.2. Это приложение имеет инжекцию зависимостей с инверсией методов управления с использованием SimpleInjector и технику ориентированного на аспекты программирования с использованием PostSharp.
Библиотека StackExchange.Redis отлично работает на моем локальном компьютере, когда я начинаю отлаживать решение в Visual Studio 2015 Ent. на Windows 10 Pro. Я могу писать и читать с сервера Redis на моем локальном компьютере, а мое приложение может записывать и читать с сервера Redis на моем локальном компьютере, когда я развертываю / публикую свой сервер IIS приложения на своем удаленном сервере.
Но я не могу написать сервер Redis на удаленном сервере. Я проверяю порты и брандмауэры, но они не могут ни писать, ни читать. Кроме того, когда я отслеживаю мое приложение, оно может успешно подключиться к серверу Redis на том же сервере, а также может отправлять ему команды, но при просмотре монитора Redis оно не показывает эти команды.
Что может быть причиной этого?
Примеры кода ниже
Redis Cache Manager
using System;
using System.Collections.Generic;
using System.Configuration;
using Newtonsoft.Json;
using StackExchange.Redis;
namespace Cits.Portal.Core.CrossCuttingConcern.Caching.Redis
{
public class RedisCacheManager : ICacheManager
{
private static readonly Lazy<ConnectionMultiplexer> LazyConnection = new Lazy<ConnectionMultiplexer>(() =>
{
var configurationOptions = new ConfigurationOptions();
#if DEBUG
configurationOptions.EndPoints.Add("localhost", 6379);
#else
configurationOptions.EndPoints.Add("141.11.11.212", 6379);
#endif
configurationOptions.AllowAdmin = true;
configurationOptions.AbortOnConnectFail = false;
return ConnectionMultiplexer.Connect(configurationOptions);
});
public static ConnectionMultiplexer Connection => LazyConnection.Value;
public static IDatabase RedisCache => Connection.GetDatabase();
public void Add(string key, object data, int cacheTime)
{
if (data == null || IsAdd(key))
return;
var value = TimeSpan.FromMinutes(cacheTime);
RedisCache.StringSet(key, Serialize(data), value);
}
public T Get<T>(string key)
{
var value = RedisCache.StringGet(key);
if (!value.HasValue)
return default(T);
return Deserialize<T>(value);
}
public bool IsAdd(string key)
{
return RedisCache.KeyExists(key);
}
public void Remove(string key)
{
RedisCache.KeyDelete(key);
}
public void RemoveByPattern(string pattern)
{
var endPoints = Connection.GetEndPoints();
foreach (var endpoint in endPoints)
{
var server = Connection.GetServer(endpoint);
var enumerable = server.Keys(RedisCache.Database, pattern);
foreach (var current in enumerable)
Remove(current);
}
}
public void Clear()
{
var endPoints = Connection.GetEndPoints();
foreach (var endpoint in endPoints)
{
var server = Connection.GetServer(endpoint);
var enumerable = server.Keys(RedisCache.Database);
foreach (var current in enumerable)
Remove(current);
}
}
public List<string> GetKeyList()
{
var list = new List<string>();
var endPoints = Connection.GetEndPoints();
foreach (var endpoint in endPoints)
{
var server = Connection.GetServer(endpoint);
var enumerable = server.Keys(RedisCache.Database);
foreach (var redisKey in enumerable)
list.Add(redisKey);
}
return list;
}
protected virtual string Serialize(object serializableObject)
{
var jsonSerializerSettings = new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All
};
return JsonConvert.SerializeObject(serializableObject, jsonSerializerSettings);
}
protected virtual T Deserialize<T>(string serializedObject)
{
if (serializedObject == null)
return default(T);
var jsonSerializerSettings = new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All
};
return JsonConvert.DeserializeObject<T>(serializedObject, jsonSerializerSettings);
}
}
}
Redis Cache Aspect
using System;
using System.Linq;
using Cits.Portal.Core.CrossCuttingConcern.Caching.Redis;
using PostSharp.Aspects;
namespace Cits.Portal.Core.Aspects.Caching
{
[Serializable]
public class CacheAspectAttribute : MethodInterceptionAspect
{
private readonly int _cacheTimeOut;
public CacheAspectAttribute(int cacheTimeOut = 540)
{
_cacheTimeOut = cacheTimeOut;
}
public override void OnInvoke(MethodInterceptionArgs args)
{
var cacheManager = new RedisCacheManager();
if (args.Method.ReflectedType != null)
{
var methodFullName = $"{args.Method.ReflectedType.Namespace}.{args.Method.ReflectedType.Name}.{args.Method.Name}";
var arguments = args.Arguments.ToList();
var key = $"{methodFullName}({string.Join(",", arguments.Select(x => x?.ToString() ?? "<null>"))})";
if (cacheManager.IsAdd(key))
{
args.ReturnValue = cacheManager.Get<object>(key);
return;
}
base.OnInvoke(args);
cacheManager.Add(key, args.ReturnValue, _cacheTimeOut);
}
}
}
}
Наш метод списка модулей, который кэшируется
[CacheAspect]
public List<ModuleViewModel> GetListAsList()
{
var rowLogQuery = _rowLogService.GetListQueryable("Module");
var moduleQuery =
_moduleDal.GetQueryable(p => p.RowStateId != _rowState)
.Select(p => new ModuleViewModel
{
Id = p.Id,
Code = p.Code,
Name = p.Name,
IsActive = p.IsActive,
RowLogViewModel = rowLogQuery.FirstOrDefault(q => q.RowId.Equals(p.Id)),
RowStateId = p.RowStateId
}).ToList();
return moduleQuery;
}
Также это мои redis.windows.configs
bind 127.0.0.1
bind 141.11.11.212
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 0
databases 16
Также это мои redis.windows.service.configs
bind 127.0.0.1
bind 141.11.11.212
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 0
databases 16
Кроме того, у меня нет пароля redis auth. Я тестирую свое приложение на удаленном сервере, используя браузер удаленных серверов, но результат такой же.
Можете ли вы дать мне какие-либо предложения о шагах, по которым я могу найти проблему?
А это the redis.server.log
[2252] 04 Aug 15:05:42.664 # Creating Server TCP listening socket 141.11.11.212:6379: bind: No error
[7504] 07 Aug 10:03:01.666 * Redis 3.2.100 (00000000/0) 64 bit, standalone mode, port 6379, pid 7504 ready to start.
[7504] 07 Aug 10:03:01.666 # Server started, Redis version 3.2.100
[7504] 07 Aug 10:03:01.666 * DB loaded from disk: 0.002 seconds
[7504] 07 Aug 10:03:01.666 * The server is now ready to accept connections on port 6379