Panoramica delle sessioni affidabili
La messaggistica affidabile SOAP di Windows Communication Foundation (WCF) offre affidabilità del trasferimento di messaggi end-to-end tra endpoint SOAP. Svolge questa funzione su reti inaffidabili risolvendo gli errori del trasporto e gli errori a livello di messaggio SOAP. In particolare, assicura il recapito basato sulla sessione, singolo e (facoltativamente) ordinato dei messaggi inviati su intermediari SOAP o del trasporto. Il recapito basato sulla sessione raggruppa i messaggi in una sessione con ordinamento facoltativo dei messaggi.
In questo argomento vengono descritte sessioni affidabili, come e quando usarle e come proteggerle.
Sessioni affidabili WCF
Le sessioni affidabili WCF sono un'implementazione della messaggistica affidabile SOAP, nel modo definito dal protocollo WS-ReliableMessaging.
La messaggistica affidabile SOAP di WCF fornisce una sessione end-to-end affidabile tra due endpoint, indipendentemente dal numero o dal tipo di intermediari che separano gli endpoint di messaggistica. In questo modo vengono inclusi tutti gli intermediari del trasporto che non utilizzano SOAP (ad esempio proxy HTTP) o gli intermediari che utilizzano SOAP (ad esempio bridge o router basati su SOAP) necessari per il flusso dei messaggi tra gli endpoint. Un canale di sessione affidabile supporta la comunicazione interattiva, in modo che i servizi connessi da tale canale vengano eseguiti simultaneamente e possano scambiare ed elaborare messaggi in condizioni di bassa latenza, ovvero con intervalli di tempo relativamente brevi. Questo accoppiamento implica l'avanzamento o l'errore di tutti i componenti, tra cui non esiste isolamento.
Una sessione affidabile maschera due tipi di errori:
Gli errori a livello di messaggio SOAP, che includono messaggi persi o duplicati e messaggi che arrivano in un ordine diverso da quello di invio.
Gli errori del trasporto.
Una sessione affidabile implementa il protocollo WS-ReliableMessaging e una finestra di trasferimento in memoria, per mascherare gli errori a livello di messaggio SOAP, e ristabilisce le connessioni in caso di errori del trasporto.
Una sessione affidabile assicura per i messaggi SOAP ciò che TCP assicura per i pacchetti IP. Una connessione socket TCP garantisce il trasferimento singolare in ordine dei pacchetti IP tra i nodi. Il canale affidabile garantisce lo stesso tipo di trasferimento affidabile, ma differisce dall'affidabilità del socket TCP nei modi seguenti:
L'affidabilità è a livello di messaggio SOAP e non è relativa a un pacchetto di byte di dimensioni arbitrarie.
L'affidabilità è indipendente rispetto al trasporto e non solo per il trasferimento tramite TCP.
L'affidabilità non è legata a una particolare sessione del trasporto (ad esempio, la sessione fornita da una connessione TCP) e può utilizzare contemporaneamente o in sequenza più sessioni del trasporto per tutta la durata della sessione affidabile.
La sessione affidabile viene stabilita tra gli endpoint SOAP mittente e destinatario, indipendentemente dal numero di connessioni del trasporto necessarie per la connettività tra di essi. In breve, l'affidabilità TCP termina dove termina la connessione del trasporto, mentre una sessione affidabile offre affidabilità end-to-end.
Sessioni affidabili e binding
Come accennato in precedenza, una sessione affidabile è neutrale a livello di trasporto. Inoltre, una sessione affidabile può essere stabilita su molti modelli di scambio di messaggi, quali, ad esempio, quello request/reply o quello duplex. Una sessione affidabile WCF viene quindi esposta come proprietà di un set di binding.
Usare una sessione affidabile su endpoint che utilizzano:
Associazioni standard del trasporto basate su HTTP:
WsHttpBinding
e contratti unidirezionali o request/reply di esposizione.Quando si usa una sessione affidabile su un contratto di servizio semplice unidirezionale o request/reply.
WsDualHttpBinding
e contratti unidirezionali, request/reply o duplex di esposizione.WsFederationHttpBinding
e contratti unidirezionali o request/reply di esposizione.
Associazioni standard del trasporto basate su TCP:
NetTcpBinding
e contratti unidirezionali, request/reply o duplex di esposizione.
Usare una sessione affidabile in qualsiasi altra associazione creando un'associazione personalizzata, ad esempio HTTPS (per altre informazioni sui problemi, vedere Sessioni affidabili e protezione) o un'associazione named pipe.
Una sessione affidabile può essere impilata su diversi tipi di canali sottostanti con conseguente variazione della forma del canale della sessione affidabile risultante. Sul client e sul server, il tipo di canale di sessione affidabile supportato dipende dal tipo di canale sottostante utilizzato. Nella tabella seguente sono elencati i tipi di canale di sessione supportati sul client come funzione del canale sottostante.
Tipi di canale di sessione affidabili supportati† | IRequestChannel |
IRequestSessionChannel |
IDuplexChannel |
IDuplexSessionChannel |
---|---|---|---|---|
IOutputSessionChannel |
Sì | Sì | Sì | Sì |
IRequestSessionChannel |
Sì | Sì | No | No |
IDuplexSessionChannel |
No | No | Sì | Sì |
†I tipi di canale supportati sono i valori disponibili per il valore del parametro generico TChannel
passato nel metodo BuildChannelFactory<TChannel>(BindingContext).
Nella tabella seguente sono elencati i tipi di canale di sessione supportati sul server come funzione del canale sottostante.
Tipi di canale di sessione affidabili supportati† | IReplyChannel |
IReplySessionChannel |
IDuplexChannel |
IDuplexSessionChannel |
---|---|---|---|---|
IInputSessionChannel |
Sì | Sì | Sì | Sì |
IReplySessionChannel |
Sì | Sì | No | No |
IDuplexSessionChannel |
No | No | Sì | Sì |
‡I tipi di canale supportati sono i valori disponibili per il valore del parametro generico TChannel
passato nel metodo BuildChannelListener<TChannel>(BindingContext).
Sessioni affidabili e protezione
La protezione di una sessione affidabile è importante per assicurare che le parti che comunicano (servizio e client) vengano autenticate e che i messaggi scambiati nella sessione non vengano manomessi. Inoltre, è importante assicurare l'integrità di ogni singola sessione affidabile. Una sessione affidabile viene protetta mediante l'associazione a un contesto di sicurezza rappresentato e gestito da un canale di sessione di sicurezza. Il canale di sicurezza fornisce una sessione di sicurezza. Per proteggere il messaggio nella sessione affidabile vengono quindi utilizzati i token di sicurezza scambiati durante la creazione della sessione.
Quando una sessione affidabile è su TCP-S, la sessione TCP è associata alla sessione affidabile. Pertanto, la sicurezza del trasporto garantisce che la sicurezza sia associata anche alla sessione affidabile. In questo caso, la riesecuzione della connessione viene disattivata.
L'unica eccezione si verifica in caso di utilizzo di HTTPS. La sessione SSL (Secure Sockets Layer) non è associata alla sessione affidabile. Questo rappresenta una minaccia, poiché le sessioni che condividono un contesto di sicurezza (la sessione SSL) non sono protette le une alle altre; l'effettiva incidenza di tale minaccia dipende però dall'applicazione.
Utilizzo di sessioni affidabili
Per utilizzare sessioni affidabili WCF, creare un endpoint con un'associazione che supporti una sessione affidabile. Utilizzare una delle associazioni fornite dal sistema che WCF offre con la sessione affidabile attivata o creare un'associazione personalizzata con questa funzione.
Le associazioni definite dal sistema che supportano e attivano una sessione affidabile per impostazione predefinita includono:
Le associazioni fornite dal sistema che supportano una sessione affidabile come opzione ma non ne attivano una per impostazione predefinita includono:
Per un esempio di come creare un'associazione personalizzata, vedere Procedura: Creare un'associazione di sessione affidabile personalizzata con HTTPS.
Per una descrizione delle associazioni WCF che supportano sessioni affidabili, vedere Binding forniti dal sistema.
Quando usare sessioni affidabili
È importante capire quando utilizzare sessioni affidabili nell'applicazione. WCF supporta sessioni affidabili tra endpoint che sono contemporaneamente attivi e operativi. Se l'applicazione richiede che uno degli endpoint non sia disponibile per un periodo di tempo, usare code per realizzare l'affidabilità.
Se lo scenario richiede due endpoint connessi tramite TCP, TCP potrebbe essere sufficiente per fornire scambi di messaggi affidabili. Tuttavia non è necessario usare una sessione affidabile, poiché TCP garantisce che i pacchetti arrivino in ordine e una sola volta.
Se lo scenario ha una qualsiasi delle caratteristiche seguenti, è necessario considerare seriamente l'utilizzo di una sessione affidabile.
Intermediari SOAP, ad esempio router SOAP
Intermediari proxy o bridge di trasporto
Connettività intermittente
Sessioni su HTTP