Accodamento in WCF

In questa sezione viene descritto come utilizzare la comunicazione in coda in Windows Communication Foundation (WCF).

Accodamento come associazione di trasporto WCF

In WCF, i contratti specificano ciò che viene scambiato. I contratti sono scambi di messaggi dipendenti dall'azienda o specifici dell'applicazione. Il meccanismo (o la modalità) utilizzato per scambiare messaggi viene specificato nelle associazioni. Le associazioni in WCF incapsulano dettagli dello scambio di messaggi. Espongono funzionalità di configurazione che consentono all'utente di controllare vari aspetti del trasporto o del protocollo rappresentato dall'associazione. L'accodamento in WCF viene considerato come qualsiasi altra associazione di trasporto e questo è un grande vantaggio per molte applicazioni di accodamento. Oggi, molte applicazioni di accodamento vengono scritte in modo diverso dalle applicazioni distribuite in stile chiamata di procedura remota (RPC), rendendone più difficile la gestione. Con WCF, lo stile di scrittura di un'applicazione distribuita è prevalentemente lo stesso e questo facilita la gestione. Inoltre, eseguendo il factoring del meccanismo di scambio separatamente dalla regola business, è più semplice configurare il trasporto o apportarvi modifiche senza incidere sul codice specifico dell'applicazione. Nella figura seguente viene illustrata la struttura di un servizio e un client WCF utilizzando MSMQ come trasporto.

Diagramma di applicazioni in coda

Come risulta evidente dalla figura precedente, il client e il servizio devono definire solo la semantica dell'applicazione, ovvero, il contratto e l'implementazione. Il servizio configura un'associazione in coda con le impostazioni preferite. Il client utilizza ServiceModel Metadata Utility Tool (Svcutil.exe) per generare un client WCF per il servizio e generare un file di configurazione che descriva le associazioni da utilizzare per inviare messaggi al servizio. Quindi, per inviare un messaggio in coda, il client crea un'istanza di un client WCF e richiama un'operazione su di essa. Questo fa sì che il messaggio venga inviato alla coda di trasmissione e trasferito alla coda di destinazione. Tutte le complessità della comunicazione in coda vengono nascoste all'applicazione che sta inviando e ricevendo messaggi.

Tra i suggerimenti relativi all'associazione in coda in WCF sono inclusi i seguenti:

  • Tutte le operazioni del servizio devono essere unidirezionali, poiché l'associazione in coda predefinita in WCF non supporta la comunicazione duplex tramite code. In un esempio di comunicazione bidirezionale (Two-Way Communication) viene illustrato come utilizzare due contratti unidirezionali per implementare la comunicazione duplex tramite codice.
  • Per generare un client WCF utilizzando lo scambio di metadati è necessario un endpoint HTTP aggiuntivo sul servizio, in modo sia possibile eseguire query dirette su di esso per generare il client WCF e ottenere le informazioni di associazione per configurare adeguatamente la comunicazione in coda.
  • In base all'associazione in coda, è necessaria una configurazione aggiuntiva all'esterno di WCF. Ad esempio, la classe NetMsmqBinding fornita con WCF richiede che si configurino le associazioni e si proceda alla configurazione minima dell'accodamento messaggi (MSMQ).

Nelle sezioni seguenti vengono descritte le associazioni in coda specifiche fornite con WCF, basate su MSMQ.

MSMQ

Il trasporto in coda in WCF utilizza MSMQ per la relativa comunicazione in coda.

MSMQ viene fornito con Windows come componente facoltativo e viene eseguito come servizio NT. Acquisisce i messaggi per la trasmissione in una coda di trasmissione e per il recapito in una coda di destinazione. I gestori code MSMQ implementano un protocollo di trasferimento messaggi affidabile, in modo che i messaggi non vengano persi durante la trasmissione. Il protocollo può essere nativo o basato su SOAP, ad esempio SRMP (SOAP Reliable Message Protocol).

In MSMQ, le code possono essere transazionali o non transazionali. Una coda transazionale consente di acquisire e recapitare messaggi in una transazione, per poi archiviarli permanentemente nella coda. I messaggi inviati a una coda transazionale vengono trasferiti esattamente una volta in ordine. È possibile utilizzare una coda non transazionale per inviare messaggi volatili e durevoli. Un messaggio inviato a una coda non transazionale non offre alcuna assicurazione di trasferimento affidabile e può quindi essere perso.

Le code MSMQ possono essere protette anche utilizzando un'identità di Windows registrata con il servizio directory Active Directory. Quando si installa MSMQ, è possibile installare l'integrazione di Active Directory, che richiede che il computer faccia parte di una rete di dominio Windows.

Per ulteriori informazioni su MSMQ, vedere Message Queuing (MSMQ).

NetMsmqBinding

<netMsmqBinding> è l'associazione in coda fornita da WCF per due endpoint WCF per comunicare tramite MSMQ. L'associazione, pertanto, espone proprietà specifiche di MSMQ. Tuttavia, non tutte le funzionalità e le proprietà di MSMQ vengono esposte in NetMsmqBinding. La classe compatta NetMsmqBinding è progettata con una serie ottimale di funzionalità che la maggior parte dei clienti dovrebbe trovare sufficiente.

La classe NetMsmqBinding manifesta i principali concetti di accodamento descritti fino ad ora nella forma di proprietà sulle associazioni. Queste proprietà, a loro volta, comunicano a MSMQ come trasferire e recapitare i messaggi. Nelle sezioni seguenti vengono descritte le categorie di proprietà. Per ulteriori informazioni, vedere gli argomenti concettuali in cui vengono descritte specifiche proprietà in modo più completo.

Proprietà ExactlyOnce e Durable

Le proprietà ExactlyOnce e Durable incidono sulla modalità di trasferimento dei messaggi tra le code:

  • ExactlyOnce: se è impostata su true (impostazione predefinita), il canale in coda assicura che il messaggio, se recapitato, non venga duplicato. Assicura inoltre che il messaggio non venga perso. Se un messaggio non può essere recapitato, o se la durata del messaggio scade prima che il messaggio possa essere recapitato, il messaggio non riuscito, insieme al motivo dell'errore di recapito, viene registrato in una coda di messaggi non recapitabili. Se la proprietà è impostata su false, il canale in coda tenta di trasferire il messaggio. In questo caso, è possibile scegliere una coda di messaggi non recapitabili.
  • Durable: se è impostata su true (impostazione predefinita), il canale in coda assicura che MSMQ archivi il messaggio sul disco in modo permanente. Così, se il servizio MSMQ viene interrotto e riavviato, il messaggio sul disco viene trasferito alla coda di destinazione o recapitato al servizio. Se la proprietà è impostata su false, i messaggi vengono memorizzati in un archivio volatile e persi al momento dell'interruzione e del riavvio del servizio MSMQ.

Per il trasferimento affidabile ExactlyOnce, MSMQ richiede che la coda sia transazionale. Inoltre, MSMQ richiede una transazione da leggere da una coda transazionale. Se si utilizza NetMsmqBinding è quindi importante ricordare che è necessaria una transazione per inviare o ricevere messaggi quando la proprietà ExactlyOnce è impostata su true. Allo stesso modo, MSMQ richiede che la coda sia non transazionale per le situazioni che necessitano del massimo sforzo, come quando ExactlyOnce è false e per la messaggistica volatile. Quindi, quando si imposta ExactlyOnce su false o Durable su false, non è possibile inviare o ricevere messaggi utilizzando una transazione.

Nota

Assicurarsi che venga creata la coda corretta (transazionale o non transazionale) in base alle impostazioni nelle associazioni. Se ExactlyOnce è true, utilizzare una coda transazionale; altrimenti, utilizzare una coda non transazionale.

Proprietà della coda di messaggi non recapitabili

La coda di messaggi non recapitabili viene utilizzata per archiviare i messaggi il cui recapito ha esito negativo. L'utente può scrivere una logica di compensazione che legga i messaggi dalla coda di messaggi non recapitabili.

Molti sistemi di accodamento prevedono una coda di messaggi non recapitabili a livello di sistema. MSMQ include una coda di messaggi non recapitabili non transazionale a livello di sistema per i messaggi il cui recapito nelle code non transazionali ha esito negativo e una coda di messaggi non recapitabili transazionale a livello di sistema per i messaggi il cui recapito nelle code transazionali ha esito negativo.

Se più client che inviano messaggi a code di destinazione diverse condividono il servizio MSMQ, tutti i messaggi inviati dai client finiranno nella stessa coda di messaggi non recapitabili. Ciò non è sempre preferibile. Per un migliore isolamento, WCF e MSMQ in Windows Vista prevedono una coda di messaggi non recapitabili personalizzata (o specifica dell'applicazione) che l'utente può specificare per l'archiviazione dei messaggi il cui recapito ha esito negativo. Pertanto, client diversi non condividono la stessa coda di messaggi non recapitabili.

L'associazione dispone di due proprietà interessanti:

  • DeadLetterQueue: questa proprietà è un'enumerazione che indica se è necessaria una coda di messaggi non recapitabili. Nel caso sia necessaria, l'enumerazione contiene anche il tipo di coda di messaggi non recapitabili. I valori sono None, System e Custom. Per ulteriori informazioni sull'interpretazione di queste proprietà, vedere Utilizzo di code di messaggi non recapitabili per gestire errori di trasferimento dei messaggi
  • CustomDeadLetterQueue: questa proprietà è l'indirizzo URI (Uniform Resource Identifier) della coda di messaggi non recapitabili specifica dell'applicazione. La proprietà è necessaria se si sceglie DeadLetterQueue.Custom.

Proprietà di gestione dei messaggi non elaborabili

Quando il servizio legge un messaggio dalla coda di destinazione in una transazione, è possibile che non riesca a elaborarlo per vari motivi. Il messaggio viene quindi reinserito nella coda per essere nuovamente letto. Per gestire messaggi la cui elaborazione ripetutamente esito negativo, è possibile configurare nell'associazione un insieme di proprietà di gestione dei messaggi non elaborabili. Esistono quattro proprietà: ReceiveRetryCount, MaxRetryCycles, RetryCycleDelay e ReceiveErrorHandling. Per ulteriori informazioni su queste proprietà, vedere Gestione dei messaggi non elaborabili.

Proprietà di protezione

MSMQ espone il proprio modello di protezione, che prevede ad esempio l'applicazione di elenchi di controllo di accesso (ACL) su una coda o l'invio di messaggi autenticati. La classe NetMsmqBinding espone queste proprietà di protezione come parte delle proprie impostazioni di protezione del trasporto. Nell'associazione sono presenti due proprietà per la protezione del trasporto: MsmqAuthenticationMode e MsmqProtectionLevel. Le impostazioni in queste proprietà dipendono dalla modalità di configurazione di MSMQ. Per ulteriori informazioni, vedere Protezione dei messaggi mediante protezione del trasporto.

Oltre alla protezione del trasporto, il messaggio SOAP effettivo stesso può essere protetto utilizzando la protezione dei messaggi. Per ulteriori informazioni, vedere Protezione dei messaggi mediante protezione a livello di messaggio.

Anche MsmqTransportSecurity espone due proprietà, MsmqEncryptionAlgorithm e MsmqHashAlgorithm. Si tratta di enumerazioni di algoritmi diversi da scegliere per la crittografia del trasferimento da coda a coda di messaggi e l'hash delle firme.

Altre proprietà

Oltre alle proprietà precedenti, le altre proprietà specifiche di MSMQ esposte nell'associazione includono:

  • UseSourceJournal: proprietà che indica che l'inserimento nel journal di origine è attivato. L'inserimento nel journal di origine è una funzionalità MSMQ che consente di tenere traccia dei messaggi correttamente trasmessi dalla coda di trasmissione.
  • UseMsmqTracing: proprietà che indica che la traccia MSMQ è attivata. La traccia MSMQ consente di inviare messaggi di report a una coda dei report ogni volta che un messaggio lascia o arriva in un computer che ospita un gestore code MSMQ.
  • QueueTransferProtocol: enumerazione del protocollo da utilizzare per i trasferimenti di messaggi da coda a coda. MSMQ implementa un protocollo di trasferimento da coda a coda nativo e un protocollo basato su SOAP denominato SRMP (SOAP Reliable Messaging Protocol). SRMP viene utilizzato quando si utilizza il trasporto HTTP per i trasferimenti da coda a coda. Viene invece utilizzato il protocollo SRMP protetto quando si utilizza HTTPS per i trasferimenti da coda a coda.
  • UseActiveDirectory: valore booleano che indica se è necessario utilizzare Active Directory per la risoluzione degli indirizzi delle code. Per impostazione predefinita, questa funzionalità è disattivata. Per ulteriori informazioni, vedere Mapping fra gli endpoint di servizio e l'indirizzamento delle code.

MsmqIntegrationBinding

La classe MsmqIntegrationBinding viene utilizzata quando si desidera che un endpoint WCF comunichi con un'applicazione MSMQ esistente scritta in C, C++, COM o con API System.Messaging.

Le proprietà dell'associazione sono le stesse di NetMsmqBinding. Esistono tuttavia le differenze seguenti:

  • Il contratto dell'operazione per MsmqIntegrationBinding si limita ad accettare un solo parametro di tipo MsmqMessage, in cui il parametro di tipo è il tipo di corpo.
  • Molte delle proprietà dei messaggi native MSMQ vengono esposte in MsmqMessage per l'utilizzo.
  • Per agevolare la serializzazione e la deserializzazione del corpo del messaggio vengono forniti serializzatori XML e ActiveX.

Vedere anche

Concetti

Mapping fra gli endpoint di servizio e l'indirizzamento delle code
Sito Web che ospita un'applicazione in coda