Partilhar via


Channel Factory e Caching

Os aplicativos cliente WCF usam a ChannelFactory<TChannel> classe para criar um canal de comunicação com um serviço WCF. A criação ChannelFactory<TChannel> de instâncias incorre em alguma sobrecarga porque envolve as seguintes operações:

  • Construção da ContractDescription árvore

  • Refletindo todos os tipos de CLR necessários

  • Construindo a pilha de canais

  • Eliminação de recursos

Para ajudar a minimizar essa sobrecarga, o WCF pode armazenar fábricas de canal em cache quando você estiver usando um proxy de cliente WCF.

Gorjeta

Você tem controle direto sobre a criação de fábrica de canal quando usa a ChannelFactory<TChannel> classe diretamente.

Os proxies de cliente WCF gerados com a ServiceModel Metadata Utility Tool (Svcutil.exe) são derivados de ClientBase<TChannel>. ClientBase<TChannel> Define uma propriedade estática CacheSetting que define o comportamento de cache de fábrica do canal. As configurações de cache são feitas para um tipo específico. Por exemplo, a configuração ClientBase<ITest>.CacheSettings para um dos valores definidos abaixo afetará apenas os proxy/ClientBase do tipo ITest. A configuração de cache para um determinado ClientBase<TChannel> é imutável assim que a primeira instância proxy/ClientBase é criada.

Especificando o comportamento de cache

O comportamento de cache é especificado definindo a CacheSetting propriedade como um dos seguintes valores.

Valor de configuração de cache Description
AlwaysOn Todas as instâncias de dentro do domínio do ClientBase<TChannel> aplicativo podem participar do cache. O desenvolvedor determinou que não há implicações de segurança adversas para o cache. O cache não será desativado mesmo se as propriedades "sensíveis à segurança" forem ClientBase<TChannel> acessadas. As propriedades "sensíveis à segurança" de ClientBase<TChannel> são ClientCredentials, Endpoint e ChannelFactory.
Default Somente instâncias criadas a partir de pontos de extremidade definidos em arquivos de ClientBase<TChannel> configuração participam do armazenamento em cache no domínio do aplicativo. Quaisquer instâncias criadas programaticamente dentro desse domínio de ClientBase<TChannel> aplicativo não participarão do cache. Além disso, o cache será desabilitado para uma instância assim ClientBase<TChannel> que qualquer uma de suas propriedades "sensíveis à segurança" for acessada.
AlwaysOff O cache está desativado para todas as instâncias de ClientBase<TChannel> um tipo específico dentro do domínio do aplicativo em questão.

Os trechos de código a seguir ilustram como usar a CacheSetting propriedade.

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

No código acima, todas as instâncias de usarão a mesma fábrica de TestClient canais.

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

No exemplo acima, todas as instâncias de usariam a mesma fábrica de TestClient canais, exceto a instância #4. A instância #4 usaria uma fábrica de canais criada especificamente para seu uso. Essa configuração funcionaria para cenários em que um ponto de extremidade específico precisa de configurações de segurança diferentes dos outros pontos de extremidade do mesmo tipo de fábrica de canal (neste 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 {}

No exemplo acima, todas as instâncias de usariam fábricas de TestClient canais diferentes. Isso é útil quando cada ponto de extremidade tem requisitos de segurança diferentes e não faz sentido armazenar em cache.

Consulte também