Condividi tramite


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. Questa operazione viene eseguita sulle reti inaffidabili superando gli errori di trasporto e gli errori a livello di messaggio SOAP. In particolare, fornisce il recapito basato su sessione, unico e (facoltativamente) ordinato per i messaggi inviati attraverso intermediari SOAP o trasporti. Il recapito basato su sessione consente di raggruppare i messaggi in una sessione con l'ordinamento facoltativo dei messaggi.

In questo argomento vengono descritte sessioni affidabili, come e quando usarle e come proteggerle.

Sessioni affidabili di WCF

Le sessioni affidabili WCF sono un'implementazione della messaggistica affidabile SOAP definita dal protocollo WS-ReliableMessaging.

La messaggistica affidabile WCF SOAP fornisce una sessione affidabile end-to-end tra due endpoint, indipendentemente dal numero o dal tipo di intermediari che separano gli endpoint di messaggistica. Sono inclusi tutti gli intermediari di trasporto che non usano SOAP (ad esempio proxy HTTP) o intermediari che usano SOAP (ad esempio, router o bridge 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 scambiati ed elaborano i messaggi in condizioni di bassa latenza, ovvero entro intervalli relativamente brevi di tempo. Questo accoppiamento significa che questi componenti progrediscono insieme o falliscono insieme, pertanto non vi è alcun isolamento tra di essi.

Una sessione affidabile maschera due tipi di errori:

  • Errori a livello di messaggio SOAP, che includono messaggi e messaggi persi o duplicati che arrivano in un ordine diverso rispetto all'ordine in cui sono stati inviati.

  • Errori di 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 ristabilire le connessioni in caso di errori di trasporto.

Una sessione affidabile fornisce ai messaggi SOAP ciò che TCP fornisce per i pacchetti IP. Una connessione socket TCP fornisce un singolare trasferimento in ordine di pacchetti IP tra nodi. Il canale reliable offre lo stesso tipo di trasferimento affidabile, ma differisce dall'affidabilità del socket TCP nei modi seguenti:

  • L'affidabilità è a livello di messaggio SOAP, non per un pacchetto di byte di dimensioni arbitrarie.

  • L'affidabilità è indipendente dal trasporto, non solo per il trasferimento tramite TCP.

  • L'affidabilità non è associata a una sessione di trasporto specifica( ad esempio, la sessione fornita da una connessione TCP) e può usare più sessioni di trasporto simultaneamente o sequenziali per tutta la durata della sessione affidabile.

  • La sessione affidabile è tra gli endpoint SOAP del mittente e del ricevitore, indipendentemente dal numero di connessioni di trasporto necessarie per la connettività tra di esse. In breve, l'affidabilità TCP termina dove termina la connessione di trasporto, mentre una sessione affidabile fornisce affidabilità end-to-end.

Sessioni e collegamenti affidabili

Come accennato in precedenza, una sessione affidabile è neutrale rispetto al tipo di trasporto. Inoltre, è possibile stabilire una sessione affidabile su molti modelli di scambio di messaggi, ad esempio request-reply o duplex. Una sessione affidabile WCF viene esposta come proprietà di un set di binding.

Usare una sessione affidabile sugli endpoint che usano:

  • Associazioni standard di trasporto basate su HTTP:

    • WsHttpBinding e espongono contratti richiesta-risposta o unidirezionali.

    • Quando si utilizza una sessione affidabile con un contratto di servizio di richiesta-risposta oppure un contratto di servizio semplice unidirezionale.

    • WsDualHttpBinding e esporre contratti duplex, richiesta-risposta o monodirezionali.

    • WsFederationHttpBinding e espongono contratti richiesta-risposta o unidirezionali.

  • Associazioni standard di trasporto basate su TCP:

    • NetTcpBinding ed esporre contratti di tipo duplex, richiesta-risposta o unidirezionale.

Usare una sessione affidabile in qualsiasi altra associazione creando un'associazione personalizzata, ad esempio HTTPS (per altre informazioni sui problemi, vedere Sessioni affidabili e sicurezza) o un'associazione named pipe.

Puoi impilare una sessione sicura su diversi tipi di canali sottostanti e la configurazione finale del canale di sessione sicura varia. Sia nel client che nel server, il tipo di canale di sessione affidabile supportato dipende dal tipo di canale sottostante usato. Nella tabella seguente sono elencati i tipi di canali di sessione supportati nel client come funzione del tipo di canale sottostante.

Tipi di canale di sessione affidabili supportati† IRequestChannel IRequestSessionChannel IDuplexChannel IDuplexSessionChannel
IOutputSessionChannel
IRequestSessionChannel NO NO
IDuplexSessionChannel NO NO

† I tipi di canale supportati sono i valori disponibili per il valore del parametro generico TChannel passato al BuildChannelFactory<TChannel>(BindingContext) metodo .

Nella tabella seguente sono elencati i tipi di canali di sessione supportati nel server come funzione del tipo di canale sottostante.

Tipi di canale di sessione affidabili supportati* IReplyChannel IReplySessionChannel IDuplexChannel IDuplexSessionChannel
IInputSessionChannel
IReplySessionChannel NO NO
IDuplexSessionChannel NO NO

*I tipi di canale supportati sono i valori disponibili per il valore del parametro generico TChannel passato al BuildChannelListener<TChannel>(BindingContext) metodo .

Sessioni affidabili e sicurezza

La protezione di una sessione affidabile è importante per garantire che le parti di comunicazione (servizio e client) siano autenticate e che i messaggi scambiati nella sessione non vengano manomessi. Inoltre, è importante garantire l'integrità di ogni singola sessione affidabile. Una sessione affidabile è protetta associandola a un contesto di sicurezza rappresentato e gestito da un canale di sessione di sicurezza. Il canale di sicurezza fornisce una sessione di sicurezza. I token di sicurezza scambiati durante la definizione della sessione vengono quindi usati per proteggere i messaggi nella sessione affidabile.

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 riattivazione della connessione viene disattivata.

L'unica eccezione è quando si usa HTTPS. La sessione Secure Sockets Layer (SSL) non è legata alla sessione affidabile. Ciò impone una minaccia perché le sessioni che condividono un contesto di sicurezza (la sessione SSL) non sono protette tra loro; questo potrebbe o non essere una minaccia reale a seconda dell'applicazione.

Uso di sessioni affidabili

Per utilizzare le sessioni affidabili di WCF, creare un endpoint con un'associazione che supporta una sessione affidabile. Usare una delle associazioni fornite dal sistema fornite da WCF con la sessione affidabile abilitata o creare un'associazione personalizzata che esegue questa operazione.

Le associazioni definite dal sistema che supportano e abilitano una sessione affidabile per impostazione predefinita includono:

Le associazioni fornite dal sistema che supportano una sessione affidabile come opzione, ma non ne abilitano 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 discussione sui binding WCF che supportano sessioni affidabili, vedere System-Provided Bindings.

Quando usare sessioni affidabili

È importante comprendere quando usare sessioni affidabili nell'applicazione. WCF supporta sessioni affidabili tra endpoint che siano entrambi attivi contemporaneamente. Se l'applicazione richiede che uno degli endpoint non sia disponibile per un periodo di tempo, usare le code per ottenere l'affidabilità.

Se lo scenario richiede due endpoint connessi tramite TCP, TCP potrebbe essere sufficiente per fornire scambi di messaggi affidabili. Anche se non è necessario usare una sessione affidabile, poiché TCP garantisce che i pacchetti arrivino in ordine e una sola volta.

Se lo scenario presenta una delle caratteristiche seguenti, è necessario prendere in considerazione seriamente l'uso di una sessione affidabile.

  • Intermediari SOAP, ad esempio router SOAP

  • Intermediari proxy o ponti di trasporto

  • Connettività intermittente

  • Sessioni tramite HTTP

Vedere anche