AppFabric: не Мог связаться с сервисом кэша

Обновление: Я теперь реализовал это правильно. Для получения дополнительной информации посмотрите мое сообщение в блоге об этом.

Я пытаюсь использовать AppFabric с NHibernate как мой второй поставщик кэша уровня, но я получаю следующую ошибку: ErrorCode:Initialization: не Мог связаться с сервисом кэша. Свяжитесь с администратором и обратитесь к документации справки продукта для возможных причин.

Я предполагаю, что проблема с моей конфигурацией в web.config:

    
...

Я загрузил NHibernate. Исходный код кэшей, чтобы попытаться обнаружить, где проблема заключается и исключение, бросается в конструктора VelocityClient, когда метод GetCache называют:

  public VelocityClient(string regionName, IDictionary properties)
  {
      region = regionName.GetHashCode().ToString(); //because the region name length is limited
      var cacheCluster = new CacheFactory();
      cache = cacheCluster.GetCache(CacheName);
      try
      {
          cache.CreateRegion(region, true);
      }
      catch (CacheException) {}
  }

Если я добавляю часы к cacheCluster переменной, я могу найти _servers частную переменную, которая имеет одну Систему. Данные. Кэширование. EndpointID, который имеет набор свойств MyURI к сети tcp://localhost:22234/AppFabricCachingServive, который я предполагаю, произошел из конфигурации в web.config.

Если Вы не знаете точной причины проблемы, но имеете некоторые идеи о том, как пойти о поиске и устранении неисправностей этой проблемы, которая очень ценилась бы также.

Дополнительная информация


Я получаю следующие результаты команды, Get-CacheHostConfig -HostName tn-staylor-02 -CachePort 22233:

HostName        : tn-staylor-02
ClusterPort     : 22234
CachePort       : 22233
ArbitrationPort : 22235
ReplicationPort : 22236
Size            : 3001 MB
ServiceName     : AppFabricCachingService
HighWatermark   : 90%
LowWatermark    : 70%
IsLeadHost      : True

Таким образом, я думаю значения, которые я настроил в web.config, в порядке.


Гугля эту проблему и исследование, как создать AppFabric во-первых, я столкнулся с двумя немного отличающимися способами того, как настроить кэш в web.config. Путем я описал выше и способ, которым у Hanselman есть он в его сообщении в блоге AppFabric

Я на самом деле запустил с него как это однако, я получил следующую ошибку, которая является, как я приехал, чтобы настроить его, как у меня есть он теперь:

ErrorCode: тег "dcacheClient", не указанный в файле конфигурации приложения. Укажите допустимый тег в конфигурационном файле.


Полное отслеживание стека исключения, которое получает добавленный VelocityClient:

Система. Данные. Кэширование. CacheException произошел сообщение = "ErrorCode: \"dcacheClient \" тег, не указанный в файле конфигурации приложения. Укажите допустимый тег в конфигурационном файле". Источник = "CacheBaseLibrary" ErrorCode = "ERRCMC0004" StackTrace: в System. Данные. Кэширование. ClientConfigFile. ThrowException (Представляют в виде строки errorCode, Строковый параметрический усилитель) в System. Данные. Кэширование. ClientConfigReader. GetDeployementMode () в Системе. Данные. Кэширование. ClientConfigurationManager. InitializeDepMode (ClientConfigReader cfr) в System. Данные. Кэширование. ClientConfigurationManager. Инициализируйте (Строковый путь) в System. Данные. Кэширование. ClientConfigurationManager.. ctor () в System. Данные. Кэширование. CacheFactory. InitCacheFactory () в Системе. Данные. Кэширование. CacheFactory. GetCache (Представляют cacheName в виде строки) в NHibernate. Кэши. Скорость. VelocityClient.. ctor (Представляют regionName в виде строки, IDictionary '2 свойства) в C:\Source\Projects\NHibernate.contrib\trunk\src\NHibernate.Caches\Velocity\NHibernate.Caches.Velocity\VelocityClient.cs:line 67 InnerException:


Править: Добавленный вывод от get-cachehost согласно просьбе @PhilPursglove

Вывод от get-cachehost:

HostName : CachePort      Service Name            Service Status Version Info
--------------------      ------------            -------------- ------------
tn-staylor-02:22233       AppFabricCachingService UP             1 [1,1][1,1]

РЕШЕНИЕ: @PhilPursglove был пятном на. Скоростной поставщик NHibernate использовал старый dll's, настолько обновляющий их, и вносил несколько изменений кода, разрешил мои проблемы. Я думал, что буду включать свое полное решение здесь.

  1. Загруженный источник NHibernate.contrib с репозитория SVN в https://nhcontrib.svn.sourceforge.net/svnroot/nhcontrib/trunk
  2. Открытый NHibernate. Кэши. Все решение и удаленный ссылки на старый скоростной dll's от NHibernate. Кэши. Скоростной проект.
  3. Добавленные ссылки на dll's Матрицы Приложения, которые были установлены, когда я установил Матрицу Приложения. Это не нормальный случай добавления ссылки на блок в GAC, но эта статья описывает, как сделать это.
  4. Добавление новых ссылок означало, что класс VelocityClient больше не компилировал. С определенной справкой от этого я придумал версию VelocityClient.cs ниже.
  5. Я добавил ссылку на новую версию NHibernate. Кэши. Скорость к моему проекту, внесенному изменения ниже в мою конфигурацию и все работало.

VelocityClient.cs

using System;
using System.Collections.Generic;
using Microsoft.ApplicationServer.Caching;
using log4net;
using NHibernate.Cache;
using CacheException = Microsoft.ApplicationServer.Caching.DataCacheException;
using CacheFactory = Microsoft.ApplicationServer.Caching.DataCacheFactory;

namespace NHibernate.Caches.Velocity
{
    public class VelocityClient : ICache
    {
        private const string CacheName = "nhibernate";
        private static readonly ILog log;
        private readonly DataCache cache;
        private readonly string region;
        private Dictionary locks = new Dictionary();

        static VelocityClient()
        {
            log = LogManager.GetLogger(typeof (VelocityClient));
        }

        public VelocityClient() : this("nhibernate", null) {}

        public VelocityClient(string regionName) : this(regionName, null) {}

        public VelocityClient(string regionName, IDictionary properties)
        {
            region = regionName.GetHashCode().ToString(); //because the region name length is limited
            var cacheCluster = new CacheFactory();
            cache = cacheCluster.GetCache(CacheName);
            try
            {
                cache.CreateRegion(region);
            }
            catch (CacheException) {}
        }

        #region ICache Members

        public object Get(object key)
        {
            if (key == null)
            {
                return null;
            }
            if (log.IsDebugEnabled)
            {
                log.DebugFormat("fetching object {0} from the cache", key);
            }

            DataCacheItemVersion version = null;
            return cache.Get(key.ToString(), out version, region);
        }

        public void Put(object key, object value)
        {
            if (key == null)
            {
                throw new ArgumentNullException("key", "null key not allowed");
            }
            if (value == null)
            {
                throw new ArgumentNullException("value", "null value not allowed");
            }

            if (log.IsDebugEnabled)
            {
                log.DebugFormat("setting value for item {0}", key);
            }

            cache.Put(key.ToString(), value, region);
        }

        public void Remove(object key)
        {
            if (key == null)
            {
                throw new ArgumentNullException("key");
            }
            if (log.IsDebugEnabled)
            {
                log.DebugFormat("removing item {0}", key);
            }

            if (Get(key.ToString()) != null)
            {
                cache.Remove(region, key.ToString());
            }
        }

        public void Clear()
        {
            cache.ClearRegion(region);
        }

        public void Destroy()
        {
            Clear();
        }

        public void Lock(object key)
        {
            DataCacheLockHandle lockHandle = null;

            if (Get(key.ToString()) != null)
            {
                try
                {
                    cache.GetAndLock(key.ToString(), TimeSpan.FromMilliseconds(Timeout), out lockHandle, region);
                    locks.Add(key.ToString(), lockHandle);
                }
                catch (CacheException) {}
            }
        }

        public void Unlock(object key)
        {
            DataCacheLockHandle lockHandle = null;

            if (Get(key.ToString()) != null)
            {
                try
                {
                    if (locks.ContainsKey(key.ToString()))
                    {
                        cache.Unlock(key.ToString(), locks[key.ToString()], region);
                        locks.Remove(key.ToString());
                    }
                }
                catch (CacheException) {}
            }
        }

        public long NextTimestamp()
        {
            return Timestamper.Next();
        }

        public int Timeout
        {
            get { return Timestamper.OneMs * 60000; } // 60 seconds
        }

        public string RegionName
        {
            get { return region; }
        }

        #endregion
    }
}

NHibernate.config:

...
    NHibernate.Caches.Velocity.VelocityProvider, NHibernate.Caches.Velocity
    true
    true
...

web.config

...
    
... ...

Я не вносил дальнейшие изменения в свою конфигурацию Матрицы Приложения или что-либо.

18
задан s1mm0t 4 January 2012 в 18:01
поделиться

1 ответ

Я думаю, здесь есть два возможных виновника:

  1. В вашем web.config в элементе hosts вы указываете localhost - я бы попробовал заменить его на реальное имя сервера tn-staylor-02

  2. Трассировка стека исключений относится к CacheBaseLibrary - я не знаю многого (читай: ничего! ) о NHibernate, но рискну предположить, что этот кэш может быть не собран в релизной версии AppFabric - CacheBaseLibrary была сборкой, которая появлялась в CTP и бета-версиях, но я не думаю, что она использовалась в RTM-версии. Обратите внимание, что в элементе секции для dcacheclient, он ссылается на сборку Microsoft.ApplicationServer.Caching.Core.

6
ответ дан 30 November 2019 в 09:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: