2010-07-13 9 views
18

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.

  1. die NHibernate.contrib Quelle aus dem Repository auf https://nhcontrib.svn.sourceforge.net/svnroot/nhcontrib/trunk SVN heruntergeladen die NHibernate.Caches.Everything Lösung
  2. geöffnet und entfernt die Verweise auf die alte Geschwindigkeit DLL aus dem NHibernate.Caches.Velocity Projekt.
  3. 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.
  4. 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.
  5. 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.

+0

Wird Ihr Cache ausgeführt? Was ist die Ausgabe von 'get-cachehost'? – PhilPursglove

+0

@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

+0

Froh, dass Sie es repariert haben! Sie sollten diese NHibernate-Änderungen an den Stamm zurücksenden, damit niemand sonst dieses Problem bekommt. – PhilPursglove

Antwort

6

Ich denke, es gibt zwei mögliche Täter hier:

  1. In Ihrem Web.Config unter dem hosts Element, du Listing Sie localhost - ich würde versuchen, dass aus für den tatsächlichen Servernamen tn-staylor-02

  2. Diese Ausnahme-Stack-Trace bezieht sich auf CacheBaseLibrary Swapping - ich weiß nicht viel (sprich: alles !) über NHibernate, aber ich würde vermuten, dass dieser Cache nicht mit der Release-Version von AppFabric erstellt wurde - CacheBaseLibrary war eine Assembly, die in den CTPs und Betas erschien, aber ich glaubte nicht, dass sie in der RTM-Version verwendet wurde. Beachten Sie, dass es sich in dem Abschnittselement für dcacheclient um die Microsoft.ApplicationServer.Caching.Core-Baugruppe handelt.

+0

Ich habe versucht, tn-stayloor-02 ohne Glück zu verwenden, aber es scheint, dass Sie etwas mit der Cachebasis-Bibliothek haben können. Ich werde versuchen, die neuesten Assemblies auszutauschen, und werde wahrscheinlich auch den Code aktualisieren müssen - ich werde Sie wissen lassen, wie es mir geht. – s1mm0t

Verwandte Themen