AppFabric: Es konnte keine Verbindung zum Cache-Dienst hergestellt werden
Aktualisieren Ich habe das jetzt richtig umgesetzt. Weitere Informationen finden Sie unter myBlogeintra darüber
Ich versuche, AppFabric mit NHibernate als Cache-Anbieter der zweiten Ebene zu verwenden, erhalte jedoch die folgende Fehlermeldung:ErrorCode: Initialisierung: Es konnte keine Verbindung zum Cache-Dienst hergestellt werden. Wenden Sie sich an den Administrator, und schlagen Sie in der Produkthilfedokumentation nach, um mögliche Gründe zu ermitteln.
Ich gehe davon aus, dass das Problem bei meiner Konfiguration in der Datei web.config liegt:
<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 habe den Quellcode von NHibernate.Caches heruntergeladen, um herauszufinden, wo das Problem liegt und welche Ausnahme im VelocityClient-Konstruktor ausgelöst wird, 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 der Variable cacheCluster eine Überwachung hinzufüge, kann ich eine private Variable _servers finden, die eine System.Data.Caching.EndpointID enthält, deren MyURI-Eigenschaft auf net.tcp: // localhost: 22234 / AppFabricCachingServive festgelegt ist komme aus der Konfiguration in web.config.
Wenn Sie die genaue Ursache des Problems nicht kennen, aber einige Vorschläge zur Fehlerbehebung haben, sind Sie auch sehr dankbar.
Zusätzliche Informatio
Ich erhalte die folgenden Ergebnisse aus dem Befehl,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
So denke ich, dass die Werte, die ich in web.config konfiguriert habe, in Ordnung sind.
Beobachten Sie dieses Problem und untersuchen Sie zunächst, wie AppFabric eingerichtet wird. Dabei habe ich zwei leicht unterschiedliche Methoden zum Konfigurieren des Caches in web.config kennengelernt. So wie ich es oben beschrieben habe und wie Hanselman es in seinem @ hAppFabric-Blogbeitrag
Ich habe tatsächlich so damit angefangen, aber ich habe den folgenden Fehler bekommen, wie ich dazu gekommen bin, es so zu konfigurieren, wie ich es jetzt habe:
ErrorCode: Tag "dcacheClient" in der Anwendungskonfigurationsdatei nicht angegeben. Geben Sie ein gültiges Tag in der Konfigurationsdatei an.
Vollständiger Stack-Trace der Ausnahme, die in VelocityClient ausgelöst wird:
System.Data.Caching.CacheException aufgetreten Message = "ErrorCode:" dcacheClient "-Tag nicht in der Anwendungskonfigurationsdatei angegeben. Geben Sie ein gültiges Tag in der Konfigurationsdatei an." Source = "CacheBaseLibrary" ErrorCode = "ERRCMC0004" StackTrace: bei System.Data.Caching.ClientConfigFile.ThrowException (String errorCode, String param) bei System.Data.Caching.ClientConfigReader.GetDeployementMode () bei System.Data.CachingClient (). InitializeDepMode (ClientConfigReader cfr) at System.Data.Caching.ClientConfigurationManager.Initialize (String path) at System.Data.Caching.ClientConfigurationManager..ctor () at System.Data.Caching.CacheFactory.InitCacheFactory () at 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 \ Velocity \ NHibernate.Caches.Velocity \ VelocityClient.cs: Zeile 67 InnerException:
BEARBEITE: Ausgabe von @ hinzugefüget-cachehost
wie von @ PhilPursglove @ angeforde
Ausgabe vonget-cachehost
:
HostName : CachePort Service Name Service Status Version Info
-------------------- ------------ -------------- ------------
tn-staylor-02:22233 AppFabricCachingService UP 1 [1,1][1,1]
LÖSUN: @PhilPursglove war genau richtig. Der Geschwindigkeitsanbieter von NHibernate verwendete alte DLLs, so dass sie aktualisiert und einige Codeänderungen vorgenommen wurden, um meine Probleme zu lösen. Ich dachte, ich würde meine komplette Lösung hier aufnehmen.
Hat die Quelle NHibernate.contrib aus dem SVN-Repository unter @ heruntergeladehttps: //nhcontrib.svn.sourceforge.net/svnroot/nhcontrib/trunNHibernate.Caches.Everything-Lösung geöffnet und die Verweise auf die alten Geschwindigkeits-DLLs aus dem NHibernate.Caches.Velocity-Projekt entfernt.Added verweist auf die App Fabric-DLLs, die bei der Installation von App Fabric installiert wurden. Dies ist nicht der Normalfall, wenn Sie einen Verweis auf eine Assembly im GAC hinzufügen, sonderndieser Artikel beschreibt, wie es geht. Das Hinzufügen der neuen Referenzen führte dazu, dass die VelocityClient-Klasse nicht mehr kompiliert wurde. Mit ein bisschen Hilfe vonDie Ich habe mir unten die Version von VelocityClient.cs ausgedacht. Ich habe meinem Projekt einen Verweis auf die neue Version von NHibernate.Caches.Velocity hinzugefügt, die folgenden Änderungen an meiner Konfiguration vorgenommen und alles hat 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 Ähnlichem vorgenommen.