Duplex durevoleDurable Duplex

In questo esempio viene illustrato come impostare e configurare lo scambio durevole di messaggi duplex usando le attività di messaggistica in Windows Workflow Foundation (WF).This sample demonstrates how to set up and configure durable duplex message exchange using the messaging activities in Windows Workflow Foundation (WF). Un scambio durevole di messaggi duplex è un scambio di messaggi bidirezionale che si verifica in un lungo periodo di tempo.A durable duplex message exchange is a two-way message exchange that takes place over a long period of time. È possibile che la durata dello scambio di messaggi sia superiore alla durata del canale di comunicazione e alla durata in memoria delle istanze del servizio.The lifetime of the message exchange may be longer than the lifetime of the communication channel and the in-memory lifetime of the service instances.

Dettagli dell'esempioSample Details

In questo esempio, due servizi di Windows Communication Foundation (WCF) implementati utilizzando Windows Workflow Foundation sono configurati per avere un scambio durevole di messaggi duplex.In this sample, two Windows Communication Foundation (WCF) services implemented using Windows Workflow Foundation are configured to have a durable duplex message exchange. Lo scambio durevole di messaggi duplex è composta da due messaggi unidirezionali inviati tramite MSMQ e correlati usando scambio del contesto .NET.The durable duplex message exchange is composed from two one-way messages sent over MSMQ and correlated using .NET Context Exchange. I messaggi vengono inviati tramite le attività di messaggistica Send e Receive.The messages are sent using the Send and Receive messaging activities. Lo scambio del contesto di .NET viene usato per specificare l'indirizzo di callback nei messaggi inviati..NET Context Exchange is use to specify the callback address on the sent messages. Entrambi i servizi sono ospitati tramite i servizi Attivazione processo Windows (WAS) e sono configurati per abilitare la persistenza delle istanze dei servizi.Both services are hosted using Windows Process Activation Services (WAS) and are configured to enable persistence of the services instances.

Il primo servizio (Service1.xamlx) invia una richiesta al servizio di invio (Service2.xamlx) per l'esecuzione di un'operazione.The first service (Service1.xamlx) sends a request to the send service (Service2.xamlx) to do some work. Al termine, per indicare che l'operazione è stata completata, Service2.xamlx restituisce una notifica a Service1.xamlx.Once the work is completed, Service2.xamlx sends a notification back to Service1.xamlx to indicate that the work has been completed. Un'applicazione console del flusso di lavoro configura le code su cui i servizi sono in ascolto e invia il messaggio di avvio per l'attivazione di Service1.xamlx.A workflow console application sets up the queues that the services are listening on and sends the initial Start message to activate Service1.xamlx. Una volta che Service1.xamlx ha ricevuto da Service2.xamlx la notifica che l'operazione richiesta è stata completata, il risultato viene salvato da Service1.xamlx in un file XML.Once Service1.xamlx receives the notification from Service2.xamlx that the requested work has been completed, Service1.xamlx saves the result to an XML file. In attesa del messaggio di callback, Service1.xamlx salva in modo permanente lo stato dell'istanza usando l'oggetto WorkflowIdleBehavior predefinito.While waiting for the callback message, Service1.xamlx persists its instance state using the default WorkflowIdleBehavior. Service2.xamlx salva in modo permanente lo stato dell'istanza come parte del completamento dell'operazione richiesta da Service1.xamlx.Service2.xamlx persists its instance state as part of completing the work requested by Service1.xamlx.

Per fare in modo che venga usato lo scambio del contesto di .NET su MSMQ, entrambi i servizi sono configurati per l'uso di un'associazione personalizzata costituita da ContextBindingElement e MsmqTransportBindingElement.To configure the services to use .NET Context Exchange over MSMQ, both services are configured to use a custom binding that consists of the ContextBindingElement and the MsmqTransportBindingElement. Un indirizzo di callback viene specificato con ContextBindingElement ed è incluso in un'intestazione del contesto di callback con tutti i messaggi inviati usando un'associazione personalizzata.A callback address is specified with the ContextBindingElement and is included in a callback context header with all messages sent using a custom binding. Nel codice seguente viene definita l'associazione personalizzata.The following code example defines the custom binding.

<configuration>  
     <system.serviceModel>  
          …  
          <bindings>  
               <customBinding>  
                    <binding name="netMsmqContextBinding">  
                         <context clientCallbackAddress="net.msmq://localhost/private/DurableDuplex/Service1.xamlx"/>  
                         <msmqTransport exactlyOnce="False">  
                              <msmqTransportSecurity msmqAuthenticationMode="None" msmqProtectionLevel="None"/>  
                         </msmqTransport>  
                    </binding>  
               </customBinding>  
          </bindings>  
          …  
     </system.serviceModel>  
</configuration>  

Nota

L'associazione usata da questo esempio non è sicura.The binding used by this sample is not secure. In caso di distribuzione dell'applicazione è necessario configurare l'associazione in base ai requisiti di sicurezza dell'applicazione stessa.When deploying your application you should configure your binding based on the security requirements of your application.

Nota

Le code usate in questo esempio non sono transazionali.The queues used in this sample are not transactional. Per un esempio che illustra come configurare lo scambio di messaggi WCF usando le code di transazione, vedere la attivazione MSMQ esempio.For a sample that shows how to set up WCF message exchanges using transaction queues, see the MSMQ Activation sample.

Per l'invio del messaggio da Service1.xamlx a Service2.xamlx viene usato un endpoint client configurato con l'indirizzo di Service2.xamlx e con l'associazione personalizzata definita precedentemente.The message sent by Service1.xamlx to Service2.xamlx is sent using a client endpoint configured with the address of Service2.xamlx and the custom binding defined previously. Il callback da Service2.xamlx a Service1.xamlx viene inviato usando un endpoint client senza indirizzo configurato in modo esplicito, perché l'indirizzo viene rilevato dal contesto di callback inviato da Service1.xamlx.The callback from Service2.xamlx to Service1.xamlx is sent using a client endpoint with no explicitly configured address because the address is taken from the callback context sent by Service1.xamlx. Nel codice seguente vengono definiti gli endpoint client.The following code example defines the client endpoints.

<?xml version="1.0"?>  
<configuration>  
     <system.serviceModel>  
          …  
          <client>  
               <endpoint address="net.msmq://localhost/private/DurableDuplex/Service2.xamlx" binding="customBinding" bindingConfiguration="netMsmqContextBinding" contract="IDoWork"/>  
               <endpoint binding="customBinding" bindingConfiguration="netMsmqContextBinding" contract="INotify"/>  
          </client>  
          …  
     </system.serviceModel>  
</configuration>  

Nell'esempio di codice seguente vengono esposti endpoint tramite questa associazione personalizzata modificando il mapping del protocollo predefinito per gli indirizzi di base net.msmq, in modo che venga usata l'associazione personalizzata.The following code example exposes endpoints using this custom binding by changing the default protocol mapping for net.msmq base addresses to use this custom binding.

<configuration>  
     <system.serviceModel>  
          <protocolMapping>  
               <add scheme="net.msmq" binding="customBinding" bindingConfiguration="netMsmqContextBinding"/>  
          </protocolMapping>  
          …  
     </system.serviceModel>  
</configuration>  

Nell'esempio di codice seguente viene abilitata la persistenza per entrambi i servizi aggiungendo agli stessi il comportamento SqlWorkflowInstanceStoreBehavior e specificando la stringa di connessione per il database di persistenza.The following code example enables persistence for both services by adding the SqlWorkflowInstanceStoreBehavior behavior to both services and specifying the connection string for the persistence database.

<?xml version="1.0"?>  
<configuration>  
    <system.serviceModel>  
          …  
          <behaviors>  
               <serviceBehaviors>  
                    <behavior>  
                         <serviceDebug includeExceptionDetailInFaults="True"/>  
                         <serviceMetadata httpGetEnabled="True"/>  
                         <sqlWorkflowInstanceStore connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=DefaultSampleStore;Integrated Security=True"/>  
                    </behavior>  
               </serviceBehaviors>  
          </behaviors>  
     </system.serviceModel>  
</configuration>  

Requisiti di sistemaSystem Requirements

Per questo esempio sono richiesti i componenti seguenti.This sample requires the following components.

  1. Internet Information Services.Internet Information Services.

  2. Internet Information Services -> Compatibilità di gestione con IIS 6.0 -> Compatibilità metabase di IIS e configurazione di IIS 6.0.Internet Information Services -> IIS 6.0 Management Compatibility -> IIS Metabase and IIS 6.0 configuration compatibility.

  3. Servizi World Wide Web -> Funzionalità per lo sviluppo di applicazioni -> ASP.NETWorld Wide Web Services -> Application Development Features -> ASP.NET.

  4. Microsoft Message Queuing (MSMQ) Server.Microsoft Message Queues (MSMQ) Server.

Per usare questo esempioTo use this sample

  1. Impostare il database di persistenza e la directory dei risultati.Set up the persistence database and the results directory.

    1. Aprire il prompt dei comandi di Visual Studio 2010Visual Studio 2010.Open a Visual Studio 2010Visual Studio 2010 command prompt.

    2. Passare alla cartella di questo esempio ed eseguire Setup.cmd.Navigate to the folder for this sample and run Setup.cmd.

  2. Impostare l'applicazione virtuale.Set up the virtual application.

    1. Da un prompt dei comandi di Visual Studio 2010Visual Studio 2010 registrare ASP.NET tramite il comando seguente:From a Visual Studio 2010Visual Studio 2010 command prompt, register ASP.NET by running the following command.

      aspnet_regiis -i  
      
    2. Eseguire Visual Studio 2010Visual Studio 2010 con autorizzazioni di amministratore facendo clic Visual Studio 2010Visual Studio 2010 e selezionando Esegui come amministratore.Run Visual Studio 2010Visual Studio 2010 with administrator permissions by right-clicking Visual Studio 2010Visual Studio 2010 and selecting Run as administrator.

    3. Tramite Visual Studio 2010Visual Studio 2010 aprire il file DurableDuplex.sln.Using Visual Studio 2010Visual Studio 2010, open the DurableDuplex.sln file.

  3. Impostare le code del servizio:Set up the service queues.

    1. Per eseguire il client DurableDuplex, premere CTRL+F5.To run the DurableDuplex client, press F5.

    2. Aprire il Gestione Computer console eseguendo Compmgmt.msc da un prompt dei comandi.Open the Computer Management console by running Compmgmt.msc from a command prompt.

    3. Espandere servizi e applicazioni, Accodamento.Expand Service and Applications, Message Queuing. Code private.Private Queues.

    4. Le code durableduplex/service1.xamlx e durableduplex/service2.xamlx di mouse e scegliere proprietà.Right-click the durableduplex/service1.xamlx and durableduplex/service2.xamlx queues and select Properties.

    5. Selezionare il sicurezza scheda e consentono tutti ricevono messaggi, Visualizza il messaggio e Invia messaggio le autorizzazioni per entrambe le code.Select the Security tab and allow Everyone Receive Message, Peek Message and Send Message permissions for both queues.

    6. Aprire Gestione Internet Information Services (IIS).Open Internet Information Services (IIS) Manager.

    7. Passare a Server, siti, sito Web predefinito, privata, Duplex durevole e selezionare Opzioni avanzate.Browse to Server, Sites, Default Web site, private, Durable Duplex and select Advanced Options.

    8. Modifica il protocolli abilitati a MSMQ.Change the Enabled Protocols to http,net.msmq.

  4. Eseguire l'esempio.Run the sample.

    1. Passare a http://localhost/private/durableduplex/service1.xamlx e http://localhost/private/durableduplex/service2.xamlx per assicurarsi che entrambi i servizi siano in esecuzione.Browse to http://localhost/private/durableduplex/service1.xamlx and http://localhost/private/durableduplex/service2.xamlx to ensure that both services are running.

    2. Premere F5 per eseguire DurableDuplexClient.Press F5 to run DurableDuplexClient.

      Quando lo scambio durevole di messaggi duplex è completato, viene salvato un file result.xml nella cartella C:\Inbox contenente il risultato dello scambio di messaggi.When the durable duplex message exchange completes a result.xml file is saved to the C:\Inbox folder and contains the result of the message exchange.

Per eseguire la pulizia (facoltativo)To cleanup (Optional)

  1. Eseguire Cleanup.cmd.Run Cleanup.cmd.

    1. Aprire il prompt dei comandi di Visual Studio 2010Visual Studio 2010.Open a Visual Studio 2010Visual Studio 2010 command prompt.

    2. Passare alla cartella di questo esempio ed eseguire Cleanup.cmd.Navigate to the folder for this sample and run Cleanup.cmd.

  2. Rimuovere l'applicazione virtuale per i servizi.Remove the virtual application for the services.

    1. Aprire Gestione Internet Information Services (IIS) eseguendo Inetmgr.exe da un prompt dei comandi.Open the Internet Information Services (IIS) Manager by running Inetmgr.exe from a command prompt.

    2. Passare al sito Web predefinito e rimuovere il privata directory virtuale.Browse to the default Web site and remove the private virtual directory.

  3. Rimuovere le code impostate per questo esempio.Remove the queues set up for this sample.

    1. Aprire la console Gestione Computer eseguendo Compmgmt.msc da un prompt dei comandi.Open the Computer Management console by running Compmgmt.msc from a command prompt.

    2. Espandere servizi e applicazioni, Accodamento, code Private.Expand Service and Applications, Message Queuing, Private Queues.

    3. Eliminare le code durableduplex/service1.xamlx e durableduplex/service2.xamlx.Delete the durableduplex/service1.xamlx and durableduplex/service2.xamlx queues.

  4. Rimuovere la directory C:\Inbox.Remove the C:\Inbox directory.

Importante

È possibile che gli esempi siano già installati nel computer.The samples may already be installed on your machine. Verificare la directory seguente (impostazione predefinita) prima di continuare.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Se questa directory non esiste, andare al Windows Communication Foundation (WCF) e gli esempi di Windows Workflow Foundation (WF) per .NET Framework 4 per scaricare tutti i Windows Communication Foundation (WCF) e WFWF esempi.If this directory does not exist, go to Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 to download all Windows Communication Foundation (WCF) and WFWF samples. Questo esempio si trova nella directory seguente.This sample is located in the following directory.

<InstallDrive>:\WF_WCF_Samples\WF\Basic\Services\DurableDuplex