Raggruppamento di messaggi in coda in una sessione
Windows Communication Foundation (WCF) fornisce una sessione che consente di raggruppare un insieme di messaggi correlati affinché vengano elaborati da un'unica applicazione ricevente. I messaggi appartenenti a una sessione devono appartenere alla stessa transazione. Poiché tutti i messaggi appartengono alla stessa transazione, se l'elaborazione di un messaggio non riesce viene eseguito il rollback dell'intera sessione. Le sessioni presentano comportamenti simili relativamente alle code di messaggi non recapitabili e alle code di messaggi non elaborabili. La proprietà di durata (TTL, Time To Live) impostata in un'associazione in coda configurata per una determinata sessione viene applicata all'intera sessione. Se allo scadere del TTL è stata inviata solo una parte dei messaggi, l'intera sessione viene inserita nella coda di messaggi non recapitabili. Analogamente, quando risulta impossibile inviare a un'applicazione alcuni messaggi di una sessione contenuti nella coda dell'applicazione, l'intera sessione viene inserita nella coda di messaggi non elaborabili (se disponibile).
Esempio di raggruppamento di messaggi
Un caso in cui raggruppare i messaggi risulta utile è l'implementazione come servizio WCF di un'applicazione di elaborazione degli ordini. Si supponga ad esempio che un client invii a questa applicazione un ordine contenente alcuni elementi. Per ogni elemento il client effettua una chiamata al servizio. Ciò comporta l'invio di un messaggio a parte per ogni elemento. È possibile che il server A riceva il primo elemento e il server B riceva il secondo elemento. Ogni volta che viene aggiunto un elemento, il server che lo sta elaborando deve individuare l'ordine associato e quindi aggiungervi tale elemento. Ciò risulta particolarmente inefficiente. Gli stessi problemi di inefficienza si presentano anche utilizzando un unico server che gestisce tutte le richieste. Infatti, tale server deve tenere traccia di tutti gli ordini correntemente in elaborazione e determinare a quale di essi appartiene il nuovo elemento. Il raggruppamento di tutte le richieste relative a un determinato ordine consente di semplificare notevolmente l'implementazione dell'applicazione descritta. L'applicazione client invia in una sessione tutti gli elementi relativi a un determinato ordine. Pertanto, quando il servizio elabora l'ordine, elabora l'intera sessione in un'unica operazione. \
Procedure
Per configurare l'utilizzo di sessioni in un contratto di servizio
Definire un contratto di servizio che richieda una sessione. A tale scopo, utilizzare l'attributo OperationContractAttribute e specificare:
SessionMode=SessionMode.Required
Poiché questi metodi non restituiscono alcun dato, contrassegnare le operazioni del contratto come unidirezionali. A tale scopo, utilizzare l'attributo OperationContractAttribute e specificare:
[OperationContract(IsOneWay = true)]
Implementare il contratto di servizio e specificare la modalità InstanceContextMode PerSession. Ciò comporta la creazione di un'unica istanza del servizio per ogni sessione.
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
Per ogni operazione del servizio è necessario specificare una transazione. A tale scopo, utilizzare l'attributo OperationBehaviorAttribute. L'operazione che completa la transazione deve inoltre impostare la proprietà TransactionAutoComplete su true.
[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
Configurare un endpoint che utilizza l'associazione NetProfileMsmqBinding fornita dal sistema.
Creare una coda transazionale utilizzando lo spazio dei nomi System.Messaging. Tale coda può anche essere creata tramite il sistema di accodamento dei messaggi (MSMQ) o la console MMC. In tal caso, creare una coda transazionale.
Creare un host del servizio mediante la classe ServiceHost.
Aprire l'host del servizio per rendere disponibile il servizio.
Chiudere l'host del servizio.
Per configurare un client
Creare un ambito di transazione per scrivere nella coda transazionale.
Creare il client WCF tramite lo strumento ServiceModel Metadata Utility Tool (Svcutil.exe).
Inviare l'ordine.
Chiudere il client WCF.
Esempio
Descrizione
Nell'esempio seguente viene riportato il codice del servizio IProcessOrder e di un client che utilizza tale servizio. In particolare, viene illustrato come WCF utilizza sessioni in coda per fornire il comportamento di raggruppamento.