Update: Ich habe dies jetzt ordnungsgemäß implementiert. Für weitere Informationen siehe meine blog post darüber.AppFabric: Konnte den Cache-Dienst nicht kontaktieren
Ich versuche, AppFabric mit NHibernate als meine zweite Ebene Cache-Provider zu verwenden, aber ich bekomme den folgenden Fehler: ErrorCode: Initialisierung: Konnte den Cache-Dienst nicht kontaktieren. Wenden Sie sich an den Administrator und lesen Sie die Dokumentation zur Produkthilfe aus möglichen Gründen.
Ich nehme an, dass das Problem mit meiner Konfiguration in web.config ist:
<section name="dcacheClient"
type="Microsoft.ApplicationServer.Caching.DataCacheClientSection, Microsoft.ApplicationServer.Caching.Core"
allowLocation="true"
allowDefinition="Everywhere"/>
...
<dcacheClient deployment="routing" localCache="False">
<localCache isEnabled="false" sync="TimeoutBased" ttlValue="300" />
<hosts>
<host name="localhost" cachePort="22233" cacheHostName="AppFabricCachingService" />
</hosts>
</dcacheClient>
ich den NHibernate.Caches Quellcode heruntergeladen habe, um zu versuchen und herausfinden, wo das Problem liegt und die Ausnahme ausgelöst wird im VelocityClient Konstruktor, wenn die GetCache Methode aufgerufen wird:
public VelocityClient(string regionName, IDictionary<string, string> 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) {}
}
Wenn ich eine Uhr auf die cacheCluster Variable hinzufügen, kann ich eine _servers private Variable finden, die eine System.Data.Caching.EndpointID hat, die die MyURI prope hat rty ist auf net.tcp: // localhost: 22234/AppFabricCachingServive gesetzt, was vermutlich von der Konfiguration in web.config stammt.
Wenn Sie die genaue Ursache des Problems nicht kennen, aber einige Ideen haben, wie Sie dieses Problem beheben können, wäre das sehr hilfreich.
Zusätzliche Informationen
ich die folgenden Ergebnisse aus dem Befehl erhalten, 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
Deshalb denke ich, dass die Werte, die ich in web.config OK sind konfiguriert haben.
dieses Problem googeln und zu untersuchen, wie AppFabric an erster Stelle einzurichten, habe ich über zwei leicht verschiedene Möglichkeiten kommen wie den Cache in web.config zu konfigurieren. Die Art, wie ich oben beschrieben habe und die Art und Weise Hanselman hat es in seiner AppFabric blog post
ich es so aber eigentlich begann, bekam ich die folgende Fehlermeldung, die ist, wie ich kam es so konfiguriert, wie ich es haben jetzt:
ErrorCode: Das Tag "dcacheClient" wurde in der Anwendungskonfigurationsdatei nicht angegeben. Geben Sie ein gültiges Tag in der Konfigurationsdatei an.
Voll Stack-Trace der Ausnahme, dass in VelocityClient geworfen wird:
System.Data.Caching.CacheException Message = "Error-Code: \" aufgetreten dcacheClient \“Tag nicht in der Anwendungskonfigurationsdatei angegeben . Geben Sie ein gültiges Tag in der Konfigurationsdatei an. " Source = "CacheBaseLibrary" Error-Code = "ERRCMC0004" Stacktrace: bei System.Data.Caching.ClientConfigFile.ThrowException (String errorcode, String param) bei System.Data.Caching.ClientConfigReader.GetDeployementMode() bei System. Data.Caching.ClientConfigurationManager.InitializeDepMode (ClientConfigReader cfr) bei System.Data.Caching.ClientConfigurationManager.Initialize (String path) bei System.Data.Caching.ClientConfigurationManager..ctor() bei System.Data.Caching.CacheFactory.InitCacheFactory() bei System .Data.Caching.CacheFactory.GetCache (String cacheName) bei NHibernate.Caches.Velocity.VelocityClient..ctor (String regionName, IDictionary`2-Eigenschaften) in C: \ Source \ Projects \ NHibernate.contrib \ trunk \ src \ NHibernate .Caches \ Geschwindigkeit \ NHibernate.Caches.Velocity \ VelocityClient.cs: Linie 67 Innerexception:
EDIT: Hinzugefügt Ausgabe von get-cachehost
wie gewünscht durch @PhilPursglove
Ausgabe von get-cachehost
:
HostName : CachePort Service Name Service Status Version Info
-------------------- ------------ -------------- ------------
tn-staylor-02:22233 AppFabricCachingService UP 1 [1,1][1,1]
SOLUTION: @PhilPursglove war genau richtig. Der NHibernate Velocity Provider verwendete alte DLLs, um sie zu aktualisieren und einige Codeänderungen zu machen, löste meine Probleme. Ich dachte, ich würde hier meine komplette Lösung einbeziehen.
- die NHibernate.contrib Quelle aus dem Repository auf https://nhcontrib.svn.sourceforge.net/svnroot/nhcontrib/trunk SVN heruntergeladen die NHibernate.Caches.Everything Lösung
- geöffnet und entfernt die Verweise auf die alte Geschwindigkeit DLL aus dem NHibernate.Caches.Velocity Projekt.
- Zusätzliche Verweise auf die App Fabric-DLLs, die bei der Installation von App Fabric installiert wurden. Dies ist nicht der normale Fall des Hinzufügens einer Referenz zu einer Assembly in der GAC, sondern this article describes how to do it.
- Das Hinzufügen der neuen Referenzen bedeutete, dass die VelocityClient-Klasse nicht mehr kompiliert wurde. Mit ein wenig Hilfe von this habe ich die Version von VelocityClient.cs unten gefunden.
- Ich habe einen Verweis auf die neue Version von NHibernate.Caches.Velocity zu meinem Projekt hinzugefügt, die unten aufgeführten Änderungen an meiner Konfiguration vorgenommen und alles funktioniert.
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<string, DataCacheLockHandle> locks = new Dictionary<string, DataCacheLockHandle>();
static VelocityClient()
{
log = LogManager.GetLogger(typeof (VelocityClient));
}
public VelocityClient() : this("nhibernate", null) {}
public VelocityClient(string regionName) : this(regionName, null) {}
public VelocityClient(string regionName, IDictionary<string, string> 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:
...
<property name="cache.provider_class">NHibernate.Caches.Velocity.VelocityProvider, NHibernate.Caches.Velocity</property>
<property name="cache.use_second_level_cache">true</property>
<property name="cache.use_query_cache">true</property>
...
web.config
...
<section name="dataCacheClient"
type="Microsoft.ApplicationServer.Caching.DataCacheClientSection, Microsoft.ApplicationServer.Caching.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
allowLocation="true"
allowDefinition="Everywhere"/>
...
<dataCacheClient>
<!-- cache host(s) -->
<hosts>
<host
name="localhost"
cachePort="22233"/>
</hosts>
</dataCacheClient>
...
Ich habe keine weiteren Änderungen an meiner App Fabric-Konfiguration oder irgendetwas vorgenommen.
Wird Ihr Cache ausgeführt? Was ist die Ausgabe von 'get-cachehost'? – PhilPursglove
@PhilPursglove, ja der Cache läuft und ich habe die Ausgabe von get-cachehost zur ursprünglichen Frage hinzugefügt. Vielen Dank, dass Sie sich die Zeit genommen haben, uns zu kommentieren. – s1mm0t
Froh, dass Sie es repariert haben! Sie sollten diese NHibernate-Änderungen an den Stamm zurücksenden, damit niemand sonst dieses Problem bekommt. – PhilPursglove