Fabrication de canal et mise en cache
Les applications clientes WCF utilisent la classe ChannelFactory<TChannel> pour créer un canal de communication avec un service WCF. La création d'instances ChannelFactory<TChannel> entraîne une certaine charge, car elle comporte les opérations suivantes :
Construction de l’arborescence ContractDescription
Refléter tous les types CLR requis
Construction de la pile de canaux
Suppression de ressources
Pour réduire cette surcharge, WCF peut mettre en cache les fabriques de canaux lorsque vous utilisez un proxy du client WCF.
Conseil
Vous disposez d'un contrôle direct sur la création de fabrique de canaux lorsque vous utilisez la classe ChannelFactory<TChannel> directement.
Les proxys de client WCF générés avec l’outil utilitaire de métadonnées ServiceModel (Svcutil.exe) sont dérivés de ClientBase<TChannel>. ClientBase<TChannel> définit une propriété CacheSetting statique qui définit le comportement de mise en cache de la fabrique de canaux. Les paramètres de cache sont faits pour un type spécifique. Par exemple, affecter l'une des valeurs définies ci dessous à ClientBase<ITest>.CacheSettings
affecte uniquement les proxy/ClientBase de type ITest
. Le paramètre de cache pour un ClientBase<TChannel> particulier est immuable dès que la première instance de proxy/ClientBase est créée.
Spécifier le comportement de mise en cache
Le comportement de mise en cache est spécifié en affectant à la propriété CacheSetting l'une des valeurs suivantes.
Valeur de paramètre de cache | Description |
---|---|
AlwaysOn | Toutes les instances de ClientBase<TChannel> du domaine d'application peuvent participer à la mise en cache. Le développeur a déterminé qu'il n'y a aucune conséquence défavorable à la mise en cache sur la sécurité. La mise en cache ne sera pas désactivée même si les propriétés de sécurité « sensibles » sur ClientBase<TChannel> sont accessibles. Les propriétés de sécurité « sensibles » de ClientBase<TChannel> sont ClientCredentials, Endpoint et ChannelFactory. |
Default | Seules les instances de ClientBase<TChannel> créées à partir des points de terminaison définis dans les fichiers de configuration participent à la mise en cache dans le domaine d'application. Les instances de ClientBase<TChannel> créées par programme dans ce domaine d'application ne participent pas à la mise en cache. En outre, la mise en cache est désactivée pour une instance de ClientBase<TChannel> une fois qu'une de ses propriétés de sécurité « sensibles » est accessible. |
AlwaysOff | La mise en cache est désactivée pour toutes les instances de ClientBase<TChannel> d'un type spécifique dans le domaine d'application concerné. |
Les extraits de code suivants montrent comment utiliser la propriété 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 { }
Dans le code ci-dessus, toutes les instances de TestClient
utilisent la même fabrique de canaux.
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 {}
Dans l'exemple ci-dessus, toutes les instances de TestClient
utilisent la même fabrique de canaux, à l'exception de l'instance #4. L'instance #4 utiliserait une fabrique de canaux créée spécifiquement pour son utilisation. Ce paramètre doit s'exécuter pour les scénarios où un point de terminaison spécifique exige des paramètres de sécurité différents de ceux des autres points de terminaison du même type de fabrique de canaux (dans ce cas 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 {}
Dans l'exemple ci-dessus, toutes les instances de TestClient
utilisent différentes fabriques de canaux. Cela est utile lorsque tous les points de terminaison ont différentes exigences de sécurité et la mise en cache n’est pas justifiée.