Channel factory e memorizzazione nella cacheChannel Factory and Caching

Le applicazioni client WCF utilizzano la classe ChannelFactory<TChannel> per creare un canale di comunicazione con un servizio WCF.WCF client applications use the ChannelFactory<TChannel> class to create a communication channel with a WCF service. La creazione di istanze dell'oggetto ChannelFactory<TChannel> comporta un sovraccarico perché include le seguenti operazioni:Creating ChannelFactory<TChannel> instances incurs some overhead because it involves the following operations:

  • Costruzione dell'albero ContractDescriptionConstructing the ContractDescription tree

  • Reflection di tutti i tipi CLR obbligatoriReflecting all of the required CLR types

  • Costruzione dello stack dei canaliConstructing the channel stack

  • Eliminazione di risorseDisposing of resources

Per ridurre il sovraccarico, WCF può memorizzare le channel factory nella cache quando si utilizza un proxy client WCF.To help minimize this overhead, WCF can cache channel factories when you are using a WCF client proxy.

Suggerimento

Si dispone di un controllo diretto sulla creazione della channel factory quando si utilizza direttamente la classe ChannelFactory<TChannel>.You have direct control over channel factory creation when you use the ChannelFactory<TChannel> class directly.

Proxy client WCF generato con strumento ServiceModel Metadata Utility Tool (Svcutil.exe) derivati da ClientBase<TChannel>.WCF client proxies generated with ServiceModel Metadata Utility Tool (Svcutil.exe) are derived from ClientBase<TChannel>. ClientBase<TChannel> definisce una proprietà CacheSetting statica che definisce il comportamento di memorizzazione nella cache della channel factory.ClientBase<TChannel> defines a static CacheSetting property that defines channel factory caching behavior. Le impostazioni della cache vengono effettuate per un tipo specifico.Cache settings are made for a specific type. Ad esempio, l'impostazione ClientBase<ITest>.CacheSettings a uno dei valori definiti di seguito influirà solo quei proxy a/ClientBase di tipo ITest.For example, setting ClientBase<ITest>.CacheSettings to one of the values defined below will affect only those proxy/ClientBase of type ITest. L'impostazione della cache per un oggetto ClientBase<TChannel> particolare non è più modificabile non appena viene creata la prima istanza di proxy/ClientBase.The cache setting for a particular ClientBase<TChannel> is immutable as soon as the first proxy/ClientBase instance is created.

Specifica del comportamento di memorizzazione nella cacheSpecifying Caching Behavior

Il comportamento di memorizzazione nella cache viene specificato impostando la proprietà CacheSetting su uno dei seguenti valori.Caching behavior is specified by setting the CacheSetting property to one of the following values.

Valore di impostazione della cacheCache Setting Value DescrizioneDescription
AlwaysOn Tutte le istanze di ClientBase<TChannel> nel dominio applicazione possono partecipare alla memorizzazione nella cache.All instances of ClientBase<TChannel> within the app-domain can participate in caching. Lo sviluppatore ha stabilito che non esistono implicazioni negative sulla sicurezza relativamente alla memorizzazione nella cache.The developer has determined that there are no adverse security implications to caching. La memorizzazione nella cache verranno non spente anche se "protezione" le proprietà ClientBase<TChannel> sono accessibili.Caching will not be turned off even if "security-sensitive" properties on ClientBase<TChannel> are accessed. Le proprietà di "protezione" di ClientBase<TChannel> sono ClientCredentials, Endpoint e ChannelFactory.The "security-sensitive" properties of ClientBase<TChannel> are ClientCredentials, Endpoint and ChannelFactory.
Default Solo le istanze di ClientBase<TChannel> create da endpoint definiti nei file di configurazione partecipano alla memorizzazione nella cache nel dominio applicazione.Only instances of ClientBase<TChannel> created from endpoints defined in configuration files participate in caching within the app-domain. Tutte le istanze di ClientBase<TChannel> create a livello di codice all'interno del dominio applicazione non prenderanno parte alla memorizzazione nella cache.Any instances of ClientBase<TChannel> created programmatically within that app-domain will not participate in caching. Inoltre, la memorizzazione nella cache verrà disabilitata per un'istanza di ClientBase<TChannel> dopo che è possibile accedere a una delle relative proprietà di "protezione".Also, caching will be disabled for an instance of ClientBase<TChannel> once any of its "security-sensitive" properties is accessed.
AlwaysOff La memorizzazione nella cache è disabilitata per tutte le istanze di ClientBase<TChannel> di un tipo specifico all'interno del dominio applicazione in questione.Caching is turned off for all instances of ClientBase<TChannel> of a particular type within the app-domain in question.

Nei frammenti di codice riportati di seguito viene illustrato come utilizzare la proprietà CacheSetting.The following code snippets illustrate how to use the CacheSetting property.

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 { }  

Nel codice precedente, tutte le istanze di TestClient utilizzeranno la stessa channel factory.In the above code, all instances of TestClient will use the same channel factory.

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 {}  

Nell'esempio precedente, tutte le istanze di TestClient utilizzano la stessa channel factory, eccetto l'istanza numero 4.In the example above, all instances of TestClient would use the same channel factory except instance #4. L'istanza numero 4 utilizza una channel factory creata in modo specifico per il relativo utilizzo.Instance #4 would use a channel factory that is created specifically for its use. Questa impostazione viene utilizzata per scenari in cui un endpoint particolare necessita di impostazioni di sicurezza diverse dagli altri endpoint dello stesso tipo di channel factory, in questo caso ITest.This setting would work for scenarios where a particular endpoint needs different security settings from the other endpoints of the same channel factory type (in this case 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 {}  

Nell'esempio precedente, tutte le istanze di TestClient utilizzano channel factory diverse.In the example above, all instances of TestClient would use different channel factories. Ciò è utile quando ogni endpoint presenta requisiti di sicurezza diversi e la memorizzazione nella cache non è appropriata.This is useful when each endpoint has different security requirements and it makes no sense to cache.

Vedere ancheSee Also

ClientBase<TChannel>
Creazione di clientBuilding Clients
ClientClients
Accesso ai servizi tramite client WCFAccessing Services Using a WCF Client
Procedura: Usare ChannelFactoryHow to: Use the ChannelFactory