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.