AppFabric Cmdlet - impossible de se connecter au cluster local
-
12-12-2019 - |
Question
J'ai essayé d'écrire une simple petite applet de commande pour me permettre de définir/obtenir/supprimer des éléments de cache.Le problème que j'ai est que je n'arrive pas à comprendre comment me connecter au cluster de cache local.
J'ai essayé d'ajouter les éléments app.config habituels, mais cela ne semble pas être récupéré...
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<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" />
</configSections>
<dataCacheClient>
<hosts>
<host name="localhost" cachePort="22233" />
</hosts>
</dataCacheClient>
</configuration>
Je préfère ne pas avoir cette configuration du tout.Donc, ce que je demande vraiment, c'est quel est le code C# équivalent pour le PowerShell suivant...
Use-CacheCluster
D'après ce que je peux comprendre Use-CacheCluster
se connecter au cluster local si aucun paramètre n'est fourni
La solution
Je viens de faire de la spéléologie dans le code AppFabric Powershell avec Reflector pour voir comment cela fonctionne sous les couvertures.Si tu appelles Use-CacheCluster
sans paramètres, par ex.pour le cluster local, le code lit la chaîne de connexion et le nom du fournisseur à partir de la clé de registre HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\AppFabric\V1.0\Configuration
.Malheureusement, il utilise ensuite ces valeurs pour construire une série de classes (ClusterConfigElement
, CacheAdmin
et ClusterHandler
) qui sont tous marqués comme internes, vous ne pouvez donc pas les utiliser pour récupérer le contexte de cluster actuel (faute d'un meilleur mot) avec lequel Powershell travaille.
Pour que votre applet de commande fonctionne, je pense que vous devez transmettre un nom d'hôte (qui serait l'un des serveurs de votre cluster, et peut-être pourriez-vous utiliser par défaut le nom de la machine locale) et un numéro de port (que vous pourriez utiliser par défaut). à 22233), et utilisez ces valeurs pour créer un DataCacheServerEndpoint
transmettre à votre DataCacheFactory
par exemple.
[Cmdlet(VerbsCommon.Set,"Value")]
public class SetValueCommand : Cmdlet
{
[Parameter]
public string Hostname { get; set; }
[Parameter]
public int PortNumber { get; set; }
[Parameter(Mandatory = true)]
public string CacheName { get; set; }
protected override void ProcessRecord()
{
base.ProcessRecord();
// Read the incoming parameters and default to the local machine and port 22233
string host = string.IsNullOrWhiteSpace(Hostname) ? Environment.MachineName : Hostname;
int port = PortNumber == 0 ? 22233 : PortNumber;
// Create an endpoint based on the parameters
DataCacheServerEndpoint endpoint = new DataCacheServerEndpoint(host, port);
// Create a config using the endpoint
DataCacheFactoryConfiguration config = new DataCacheFactoryConfiguration();
config.Servers = new List<DataCacheServerEndpoint> { endpoint };
// Create a factory using the config
DataCacheFactory factory = new DataCacheFactory(config);
// Get a reference to the cache so we can now start doing useful work...
DataCache cache = factory.GetCache(CacheName);
...
}
}
Autres conseils
Le problème est que l'appel :DataCacheFactoryConfiguration config = new DataCacheFactoryConfiguration();
à l'intérieur des mothods de l'applet de commande produit une erreur ressemblant à "Impossible d'initialiser DataCacheFactoryConfiguration".