Servizi duplex

Un contratto di servizio duplex è un modello di scambio di messaggi nel quale entrambi gli endpoint possono inviare messaggi l'uno all'altro in modo indipendente. Un servizio duplex, pertanto, può inviare messaggi all'endpoint client, fornendo un comportamento simile a quello degli eventi. Una comunicazione duplex ha luogo quando un client si connette a un servizio e fornisce a quest'ultimo un canale utilizzabile per inviare messaggi al client. Si noti che il comportamento simile a quello degli eventi di servizi duplex funziona solo all'interno di una sessione.

Per creare un contratto duplex è necessario creare una coppia di interfacce. La prima è l'interfaccia del contratto di servizio che descrive le operazioni che un client può richiamare. Il contratto di servizio deve specificare un contratto callback nella proprietà System.ServiceModel.ServiceContractAttribute.CallbackContract. Il contratto callback è l'interfaccia che definisce le operazioni che il servizio può chiamare sull'endpoint client. Un contratto duplex non richiede sessioni, sebbene le associazioni duplex fornite dal sistema le utilizzino.

Di seguito è riportato un esempio di contratto duplex.

La classe CalculatorService implementa l'interfaccia ICalculatorDuplex primaria. Il servizio utilizza la modalità di istanza PerSession per gestire il risultato per ogni sessione. Una proprietà privata denominata Callback accede al canale callback al client. Il servizio utilizza il callback per inviare i messaggi al client tramite l'interfaccia callback, come illustrato nel codice di esempio seguente.

Il client deve fornire una classe che implementa l'interfaccia callback del contratto duplex, per ricevere messaggi dal servizio. Nel codice di esempio seguente viene illustrata una classe CallbackHandler che implementa l'interfaccia ICalculatorDuplexCallback.

Il client WCF generato per un contratto duplex richiede che venga fornita una classe InstanceContext dopo la costruzione. Questa classe InstanceContext viene utilizzata come sito per un oggetto che implementa l'interfaccia callback e gestisce i messaggi restituiti dal servizio. Una classe InstanceContext viene costruita con un'istanza della classe CallbackHandler. Questo oggetto gestisce i messaggi inviati dal servizio al client sull'interfaccia callback.

La configurazione per il servizio deve essere impostata in modo da fornire un'associazione che supporta sia la comunicazione della sessione che la comunicazione duplex. L'elemento wsDualHttpBinding supporta la comunicazione della sessione e consente la comunicazione duplex fornendo connessioni HTTP doppie, una per ogni direzione.

Sul client, è necessario configurare un indirizzo utilizzabile dal server per la connessione al client, come illustrato nella configurazione di esempio seguente.

Nota

I client non duplex, la cui autenticazione mediante conversazione protetta non riesce, generano di norma un'eccezione MessageSecurityException. Se, tuttavia, un client duplex che utilizza una conversazione protetta non viene autenticato, riceve un'eccezione TimeoutException.

Quando si crea un client/servizio utilizzando l'elemento WSHttpBinding e non si include l'endpoint di callback client, verrà restituito l'errore seguente.

HTTP could not register URL
htp://+:80/Temporary_Listen_Addresses/<guid> because TCP port 80 is being used by another application.

Nel codice di esempio seguente viene illustrato come specificare l'indirizzo endpoint client nel codice.

WSDualHttpBinding binding = new WSDualHttpBinding();
EndpointAddress endptadr = new EndpointAddress("https://localhost:12000/DuplexTestUsingCode/Server");
binding.ClientBaseAddress = new Uri("https://localhost:8000/DuplexTestUsingCode/Client/");

Nel codice di esempio seguente viene illustrato come specificare l'indirizzo endpoint client nella configurazione.

<client>
    <endpoint name ="ServerEndpoint" 
          address="https://localhost:12000/DuplexTestUsingConfig/Server"
          bindingConfiguration="WSDualHttpBinding_IDuplexTest" 
            binding="wsDualHttpBinding"
           contract="IDuplexTest" />
</client>
<bindings>
    <wsDualHttpBinding>
        <binding name="WSDualHttpBinding_IDuplexTest"  
          clientBaseAddress="https://localhost:8000/myClient/" >
            <security mode="None"/>
         </binding>
    </wsDualHttpBinding>
</bindings>

Vedere anche

Attività

Procedura: creare una channel factory e utilizzarla per la creazione e la gestione di canali

Concetti

Specifica del comportamento in fase di esecuzione dei client

Altre risorse

Service Contract: Duplex