Comparteix a través de


Generador de canales y almacenamiento en memoria caché

Las aplicaciones cliente de WCF usan la clase ChannelFactory<TChannel> para crear un canal de comunicación con un servicio WCF. La crear de instancias de ChannelFactory<TChannel> genera sobrecarga porque implica las siguientes operaciones:

  • Construir el árbol ContractDescription

  • Reflejar todos los tipos de CLR necesarios

  • Construir la pila del canal

  • Desechar recursos

Para ayudar a reducir esta sobrecarga, WCF puede almacenar en caché los generadores de canal cuando se usa un proxy de cliente de WCF.

Sugerencia

Tiene el control directo sobre la creación del generador de canales cuando usa la clase ChannelFactory<TChannel> directamente.

Los proxies de cliente WCF que se generan con la herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe) se derivan de ClientBase<TChannel>. ClientBase<TChannel> define una propiedad CacheSetting estática que define el comportamiento de almacenamiento en memoria caché del generador de canales. Los valores de la memoria caché se crean para un tipo específico. Por ejemplo, el establecimiento de ClientBase<ITest>.CacheSettings en uno de los valores que se definen a continuación solo afectará al proxy o ClientBase de tipo ITest. La configuración de almacenamiento en memoria caché para un ClientBase<TChannel> determinado es inmutable en cuanto se crea la primera instancia de proxy/ClientBase.

Especificar el comportamiento de almacenamiento en memoria caché

El comportamiento de almacenamiento en memoria caché se especifica estableciendo la propiedad CacheSetting en uno de los siguientes valores.

Valor de configuración de caché Descripción
AlwaysOn Todas las instancias de ClientBase<TChannel> dentro del dominio de aplicación pueden participar en el almacenamiento en memoria caché. El desarrollador ha determinado que no hay implicaciones adversas de seguridad para almacenar en memoria caché. El almacenamiento en caché no se desactivará aunque se tenga acceso a las propiedades "que afectan a la seguridad" en ClientBase<TChannel>. Las propiedades "que afectan a la seguridad" de ClientBase<TChannel> son ClientCredentials, Endpoint y ChannelFactory.
Default Solo las instancias de ClientBase<TChannel> creadas desde extremos definidos en archivos de configuración participan en el almacenamiento en memoria caché dentro del dominio de aplicación. Cualquier instancia de ClientBase<TChannel> creada mediante programación dentro de ese dominio de aplicación no participará en el almacenamiento en memoria caché. Además, el almacenamiento en caché se deshabilitará para una instancia de ClientBase<TChannel> una vez que se tenga acceso a cualquiera de las propiedades "que afectan a la seguridad".
AlwaysOff El almacenamiento en caché está desactivado para todas las instancias de ClientBase<TChannel> de un tipo determinado dentro del dominio de aplicación en cuestión.

Los fragmentos de código siguientes muestran cómo usar la propiedad CacheSetting.

class Program
{
   static void Main(string[] args)
   {
      ClientBase<ITest>.CacheSettings = CacheSettings.AlwaysOn;
      foreach (string msg in messages)
      {
         using (TestClient proxy = new TestClient (new BasicHttpBinding(), new EndpointAddress(address)))
         {
            // ...
            proxy.Test(msg);
            // ...
         }
      }
   }
}
// Generated by SvcUtil.exe
public partial class TestClient : System.ServiceModel.ClientBase, ITest { }

En el código anterior, todas las instancias de TestClient usarán el mismo generador de canales.

class Program
{
   static void Main(string[] args)
   {
      ClientBase<ITest>.CacheSettings = CacheSettings.Default;
      int i = 1;
      foreach (string msg in messages)
      {
         using (TestClient proxy = new TestClient ("MyEndpoint", new EndpointAddress(address)))
         {
            if (i == 4)
            {
               ServiceEndpoint endpoint = proxy.Endpoint;
               ... // use endpoint in some way
            }
            proxy.Test(msg);
         }
         i++;
   }
}

// Generated by SvcUtil.exe
public partial class TestClient : System.ServiceModel.ClientBase, ITest {}

En el ejemplo anterior, todas las instancias de TestClient usarían el mismo generador de canales excepto la instancia nº 4. La instancia nº 4 usaría un generador de canales que se crea específicamente para su uso. Este valor funcionaría para escenarios donde un punto de conexión determinado necesita diferentes configuraciones de seguridad que los demás puntos de conexión del mismo tipo de generador de canales (en este caso ITest).

class Program
{
   static void Main(string[] args)
   {
      ClientBase<ITest>.CacheSettings = CacheSettings.AlwaysOff;
      foreach (string msg in messages)
      {
         using (TestClient proxy = new TestClient ("MyEndpoint", new EndpointAddress(address)))
         {
            proxy.Test(msg);
         }
      }
   }
}

// Generated by SvcUtil.exe
public partial class TestClient : System.ServiceModel.ClientBase, ITest {}

En el ejemplo anterior, todas las instancias de TestClient usarían diferentes generadores de canales. Esto es útil cuando cada extremo tiene distintos requisitos de seguridad y no tiene sentido almacenar en memoria caché.

Consulte también