Applicazioni client di livello intermedio

Questo argomento illustra vari problemi specifici delle applicazioni client di livello intermedio che usano Windows Communication Foundation (WCF).

Miglioramento delle prestazioni dei client di livello intermedio

Paragonata alle tecnologie di comunicazione precedenti, ad esempio i servizi Web che usano ASP.NET, la creazione di un'istanza client WCF può essere più complessa a causa del vasto set di funzionalità di WCF. Ad esempio, quando un oggetto ChannelFactory<TChannel> viene aperto può stabilire una sessione protetta con il servizio, una procedura che aumenta il tempo di avvio per l'istanza client. In genere queste funzionalità aggiuntive non influiscono significativamente sulle applicazioni client in quanto il client WCF effettua più chiamate e quindi viene chiuso.

Le applicazioni client di livello intermedio possono tuttavia creare rapidamente molti oggetti client WCF e devono quindi soddisfare maggiori requisiti di inizializzazione. Per migliorare le prestazioni delle applicazioni di livello intermedio durante le chiamate ai servizi è possibile seguire principalmente due diversi approcci:

  • Memorizzare nella cache l'oggetto client WCF e riutilizzarlo, se possibile, per chiamate successive.

  • Creare un oggetto ChannelFactory<TChannel> e usarlo per creare nuovi oggetti di canale client WCF per ogni chiamata.

Quando si seguono queste procedure è opportuno considerare gli aspetti seguenti:

  • Se il servizio gestisce uno stato specifico del client usando una sessione, non è possibile riutilizzare il client WCF di livello intermedio con richieste di client di vari livelli poiché lo stato del servizio è associato allo stato del client di livello intermedio.

  • Se il servizio deve eseguire l'autenticazione per ogni singolo client, è necessario creare un nuovo client per ogni richiesta in ingresso nel livello intermedio anziché riutilizzare il client WCF di livello intermedio (o l'oggetto di canale client WCF) perché le credenziali client del livello intermedio non possono essere modificate dopo che il client WCF (o ChannelFactory<TChannel>) è stato creato.

  • Sebbene i canali e i client creati dai canali siano thread-safe, è possibile che non supportino la scrittura di più messaggi in rete contemporaneamente. Se vengono inviati messaggi di grandi dimensioni, in particolare se viene eseguito il flusso, l'operazione di invio potrebbe bloccarsi in attesa del completamento di un'altra operazione di invio. Ciò causa due tipi di problemi: la mancanza di concorrenza e la possibilità di deadlock se il flusso di controllo torna al servizio riutilizzando il canale (ovvero, il client condiviso chiama un servizio il cui percorso di codice comporta un callback al client condiviso). Questa situazione si verifica indipendentemente dal tipo di client WCF che si riutilizza.

  • È necessario gestire i canali in stato di errore indipendentemente dal fatto che si condivida o meno il canale. Quando i canali vengono riutilizzati, un canale in stato di errore può tuttavia annullare più richieste o operazioni di invio in sospeso.

Per un esempio in cui vengono illustrate le procedure consigliate per riutilizzare un client per più richieste, vedere Data binding in un client ASP.NET.

È anche possibile migliorare le prestazioni di avvio per i client che usano tipi di dati serializzabili usando la classe XmlSerializer per generare e compilare il codice di serializzazione per questi tipi di dati in fase di esecuzione. Questa procedura può comportare una riduzione delle prestazioni di avvio. Lo strumento ServiceModel Metadata Utility Tool (Svcutil.exe) può migliorare le prestazioni all'avvio per queste applicazioni generando il codice di serializzazione necessario dagli assembly compilati per l'applicazione. Per altre informazioni, vedere Procedura: Migliorare il tempo di avvio di applicazioni client WCF usando XmlSerializer.

Vedi anche