Share via


Channel factory e memorizzazione nella cache

Le applicazioni client WCF utilizzano la classe ChannelFactory<TChannel> per creare un canale di comunicazione con un servizio WCF. La creazione di istanze dell'oggetto ChannelFactory<TChannel> comporta un sovraccarico perché include le seguenti operazioni:

  • Costruzione dell'albero ContractDescription

  • Reflection di tutti i tipi CLR obbligatori

  • Costruzione dello stack dei canali

  • Eliminazione di risorse

Per ridurre il sovraccarico, WCF può memorizzare le channel factory nella cache quando si utilizza un proxy client WCF.

Suggerimento

Si dispone di un controllo diretto sulla creazione della channel factory quando si utilizza direttamente la classe ChannelFactory<TChannel>.

I proxy client WCF generati con ServiceModel Metadata Utility Tool (Svcutil.exe) sono derivati da ClientBase<TChannel>. ClientBase<TChannel> definisce una proprietà CacheSetting statica che definisce il comportamento di memorizzazione nella cache della channel factory. Le impostazioni della cache vengono effettuate per un tipo specifico. Ad esempio, l'impostazione ClientBase<ITest>.CacheSettings su uno dei valori definiti di seguito influirà solo su quei proxy/ClientBase di tipo ITest. L'impostazione della cache per un oggetto ClientBase<TChannel> particolare non è più modificabile non appena viene creata la prima istanza di proxy/ClientBase.

Specifica del comportamento di memorizzazione nella cache

Il comportamento di memorizzazione nella cache viene specificato impostando la proprietà CacheSetting su uno dei seguenti valori.

Valore di impostazione della cache Descrizione
AlwaysOn Tutte le istanze di ClientBase<TChannel> nel dominio applicazione possono partecipare alla memorizzazione nella cache. Lo sviluppatore ha stabilito che non esistono implicazioni negative sulla sicurezza relativamente alla memorizzazione nella cache. La memorizzazione nella cache non verrà disattivata anche se si accede a proprietà sensibili per la sicurezza dell'oggetto ClientBase<TChannel>. Le proprietà sensibili per la sicurezza di ClientBase<TChannel> sono ClientCredentials, Endpoint e ChannelFactory.
Default Solo le istanze di ClientBase<TChannel> create da endpoint definiti nei file di configurazione partecipano alla memorizzazione nella cache nel dominio applicazione. Tutte le istanze di ClientBase<TChannel> create a livello di codice all'interno del dominio applicazione non prenderanno parte alla memorizzazione nella cache. Inoltre, la memorizzazione nella cache verrà disabilitata per un'istanza di ClientBase<TChannel> una volta che si sia effettuato l'accesso a una delle relative proprietà sensibili per la sicurezza.
AlwaysOff La memorizzazione nella cache è disabilitata per tutte le istanze di ClientBase<TChannel> di un tipo specifico all'interno del dominio applicazione in questione.

Nei frammenti di codice riportati di seguito viene illustrato come utilizzare la proprietà 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 { }

Nel codice precedente, tutte le istanze di TestClient utilizzeranno la stessa channel factory.

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

Nell'esempio precedente, tutte le istanze di TestClient utilizzano la stessa channel factory, eccetto l'istanza numero 4. L'istanza numero 4 utilizza una channel factory creata in modo specifico per il relativo utilizzo. 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.

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

Nell'esempio precedente, tutte le istanze di TestClient utilizzano channel factory diverse. Ciò è utile quando ogni endpoint presenta requisiti di sicurezza diversi e la memorizzazione nella cache non è appropriata.

Vedi anche