Cmdlet AppFabric: no se puede conectar al clúster local
-
12-12-2019 - |
Pregunta
He estado intentando escribir un pequeño cmdlet simple que me permita configurar/obtener/eliminar elementos de caché.El problema que tengo es que no puedo entender cómo conectarme al clúster de caché local.
Intenté agregar las cosas habituales de app.config, pero parece que no se soluciona...
<?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>
Preferiría no tener esa configuración en absoluto.Entonces, lo que realmente estoy preguntando es cuál es el código C# equivalente para el siguiente PowerShell...
Use-CacheCluster
De lo que puedo reunir Use-CacheCluster
conectarse al clúster local si no se proporcionan parámetros
Solución
Acabo de investigar un poco el código de AppFabric Powershell con Reflector para ver cómo funciona bajo las sábanas.si llamas Use-CacheCluster
sin parámetros, p.para el clúster local, el código lee la cadena de conexión y el nombre del proveedor de la clave de Registro HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\AppFabric\V1.0\Configuration
.Desafortunadamente, luego usa esos valores para construir una serie de clases (ClusterConfigElement
, CacheAdmin
y ClusterHandler
) que están marcados como internos, por lo que no puede usarlos para seleccionar el contexto actual del clúster (a falta de una palabra mejor) con el que está trabajando Powershell.
Entonces, para que su cmdlet funcione, creo que necesita pasar un nombre de host (que sería uno de los servidores en su clúster, y tal vez podría usar de manera predeterminada el nombre de la máquina local) y un número de puerto (que podría usar de manera predeterminada). a 22233), y utilizar esos valores para construir un DataCacheServerEndpoint
pasar a tu DataCacheFactory
p.ej.
[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);
...
}
}
Otros consejos
El problema es que la llamada: DataCacheFactoryConfiguration Config= New DatacacheFactoryConfiguration ();
Dentro del cmdlet Mothods produce un error que suena como "No se puede inicializar DataCacheFactoryConfiguración".