Para ver el artículo en inglés, active la casilla Inglés. También puede ver el texto en inglés en una ventana emergente si pasa el puntero del mouse por el texto.
Traducción
Inglés

Generador de canales y almacenamiento en memoria caché

.NET Framework (current version)
 

Las aplicaciones cliente de WCF usan la clase ChannelFactory<TChannel> para crear un canal de comunicación con un servicio WCF. La creación de instancias de ChannelFactory<TChannel> genera algo de 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é las factorías de canales cuando se usa un proxy de cliente de WCF.

System_CAPS_tipSugerencia

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

Los clientes proxy de WCF generados con la Herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe) derivan de ClientBase<TChannel>. ClientBase<TChannel> expone una propiedad estática CacheSetting que define el comportamiento de almacenamiento en caché de la factoría de canales. Los valores de la memoria caché se crean para un tipo específico.Por ejemplo, establecer ClientBase<ITest>.CacheSettings en uno de los valores definidos debajo solo afectará al proxy/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.

El comportamiento de almacenamiento en memoria caché se especifica estableciendo la propiedad T:System.ServiceModel.ClientBase`1.CacheSetting en uno de los siguientes valores.

Valor de configuración de caché

Descripción

N:System.ServiceModel.CacheSetting.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.

N:System.ServiceModel.CacheSetting.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 memoria caché se deshabilitará para una instancia de ClientBase<TChannel> una vez que se tenga acceso a cualquiera de sus propiedades “que afectan a la seguridad”.

N:System.ServiceModel.CacheSetting.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 siguientes fragmentos de código 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.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 extremo determinado necesita diferentes configuraciones de seguridad que los demás extremos del mismo tipo de generador de canales (en este caso ITest).

class Program 
{ 
   static void Main(string[] args) 
   { 
      ClientBase.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é.

Mostrar: