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.