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

0 ответов

Другие вопросы по тегам