AppFabric: не удалось связаться с службой кеша

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

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

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

...

Я загрузил исходный код NHibernate.Caches, чтобы выяснить, где находится проблема, и исключение создается в конструкторе 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, которая имеет один идентификатор System.Data.Caching.EndpointID, который имеет свойство MyURI, установленное в net.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. То, как я описал выше, и то, как у Гензельмана есть это в своем блоге в AppFabric

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

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


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

Ошибка System.Data.Caching.CacheException Message = “ErrorCode: \” dcacheClient \ “тег, не указанный в файле конфигурации приложения. Укажите допустимый тег в файле конфигурации.” Source = “CacheBaseLibrary” ErrorCode = “ERRCMC0004” StackTrace: at System.Data.Caching.ClientConfigFile.ThrowException (String errorCode, String param) в System.Data.Caching.ClientConfigReader.GetDeployementMode () в System.Data.Caching.ClientConfigurationManager. InitializeDepMode (ClientConfigReader cfr) в System.Data.Caching.ClientConfigurationManager.Initialize (путь строки) в System.Data.Caching.ClientConfigurationManager..ctor () в System.Data.Caching.CacheFactory.InitCacheFactory () в System.Data.Caching .CacheFactory.GetCache (String cacheName) в NHibernate.Caches.Velocity.VelocityClient..ctor (String regionName, свойства IDictionary`2) в C: \ Source \ Projects \ NHibernate.contrib \ trunk \ src \ NHibernate.Caches \ Velocity \ NHibernate.Caches.Velocity \ VelocityClient.cs: строка 67 InnerException:


EDIT : Добавлен вывод 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, чтобы их модернизировать, и внесение нескольких изменений кода позволило решить мои проблемы. Я думал, что включу здесь свое полное решение.

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

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

 ... 
... ...

Я не вносил никаких изменений в конфигурацию App Fabric или что-то еще.

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

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

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

  • Как ускорить объединение нагрузки без дублирования в NHibernate?
  • NHibernate AliasToBean трансформаторные ассоциации
  • NHibernate Как мне запросить свойство IList ?
  • NHibernate с TransactionScope
  • Как просмотреть SQL, сгенерированный nHibernate?
  • Последовательный GUID в Linq-to-Sql?
  • Как создать OR для NHibernate?
  • Конфигурация NHibernate для однонаправленного отношения «один ко многим»
  • Идентификация прокси-classов NHibernate
  • Минимальный и правильный способ сопоставления «один ко многим» с NHibernate
  • Что такое «постоянство невежества»?
  • Interesting Posts

    Что представляет собой корень композиции в контексте инъекции зависимостей

    Maven родительский pom vs modules pom

    Как я могу создать приложение Android в Android Studio, которое использует Google Maps Api v2?

    Установить проверку classа для динамического текстового поля в таблице

    Явное построение типа объекта ‘###’ в запросе недопустимо.

    Windows 7 отсутствует значки и панель задач

    MySQL выбирает оператор с CASE или IF ELSEIF? Не уверен, как получить результат

    Добавили ли они новые инструменты командной строки в Windows 8?

    не удалось получить доступ к диспетчеру пакетов. это система, работающая при установке приложения для Android

    Различия между деревьями B и деревьями B +

    Добавление базового HTTP-аутентификации в службу WCF REST

    Django lazy QuerySet и разбиение на страницы

    ActionBar в диалоговом окне диалога

    Есть ли смысл в установке антивируса на Ubuntu?

    В чем разница между HashMap и TreeMap?

    Давайте будем гением компьютера.