Обновление: Я теперь реализовал это правильно. Для получения дополнительной информации посмотрите мое сообщение в блоге об этом.
Я пытаюсь использовать 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, настолько обновляющий их, и вносил несколько изменений кода, разрешил мои проблемы. Я думал, что буду включать свое полное решение здесь.
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
...
...
...
Я не вносил дальнейшие изменения в свою конфигурацию Матрицы Приложения или что-либо.
Я думаю, здесь есть два возможных виновника:
В вашем web.config в элементе hosts
вы указываете localhost
- я бы попробовал заменить его на реальное имя сервера tn-staylor-02
Трассировка стека исключений относится к CacheBaseLibrary
- я не знаю многого (читай: ничего! ) о NHibernate, но рискну предположить, что этот кэш может быть не собран в релизной версии AppFabric - CacheBaseLibrary была сборкой, которая появлялась в CTP и бета-версиях, но я не думаю, что она использовалась в RTM-версии. Обратите внимание, что в элементе секции для dcacheclient
, он ссылается на сборку Microsoft.ApplicationServer.Caching.Core
.