Gestione dei messaggi non elaborabili in MSMQ 4,0Poison Message Handling in MSMQ 4.0

Questo esempio dimostra come eseguire la gestione dei messaggi non elaborabili in un servizio.This sample demonstrates how to perform poison message handling in a service. Questo esempio è basato sul transazionale associazione MSMQ esempio.This sample is based on the Transacted MSMQ Binding sample. In questo esempio viene usato l'oggetto netMsmqBinding.This sample uses the netMsmqBinding. Il servizio è un'applicazione console indipendente che consente di osservare il servizio che riceve messaggi in coda.The service is a self-hosted console application to enable you to observe the service receiving queued messages.

Nella comunicazione in coda, il client comunica al servizio usando una coda.In queued communication, the client communicates to the service using a queue. Più precisamente, il client invia messaggi a una coda.More precisely, the client sends messages to a queue. Il servizio riceve messaggi dalla coda.The service receives messages from the queue. Di conseguenza, per comunicare mediante una coda il servizio e il client non devono essere in esecuzione contemporaneamente.The service and client therefore, do not have to be running at the same time to communicate using a queue.

Un messaggio non elaborabile è un messaggio che viene letto ripetutamente da una coda quando il servizio che legge il messaggio è in grado di elaborarlo e quindi termina la transazione nella quale viene letto il messaggio.A poison message is a message that is repeatedly read from a queue when the service reading the message cannot process the message and therefore terminates the transaction under which the message is read. In questi casi, il messaggio viene ritentato.In such cases, the message is retried again. Teoricamente l'operazione può ripetersi all'infinito se c'è un problema con il messaggio.This can theoretically go on forever if there is a problem with the message. Notare che questo può accadere solo quando si usano transazioni per leggere dalla coda e richiamare il funzionamento del servizio.Note that this can only occur when you use transactions to read from the queue and invoke the service operation.

In base alla versione di MSMQ, NetMsmqBinding supporta dal rilevamento limitato fino a quello completo dei messaggi non elaborabili.Based on the version of MSMQ, the NetMsmqBinding supports limited detection to full detection of poison messages. Dopo che il messaggio è stato rilevato come non elaborabile, è possibile gestirlo in alcuni modi.After the message has been detected as poisoned, then it can be handled in several ways. Di nuovo, in base alla versione di MSMQ, NetMsmqBinding supporta dalla gestione limitata fino a quella completa dei messaggi non elaborabili.Again, based on the version of MSMQ, the NetMsmqBinding supports limited handling to full handling of poison messages.

Questo esempio illustra le funzioni dei messaggi non elaborabili limitate fornite nella piattaforma Windows Server 2003Windows Server 2003 e Windows XPWindows XP e quelle complete fornite in Windows VistaWindows Vista.This sample illustrates the limited poison facilities provided on Windows Server 2003Windows Server 2003 and Windows XPWindows XP platform and the full poison facilities provided on Windows VistaWindows Vista. In entrambi gli esempi, l'obiettivo è spostare il messaggio non elaborabile in un'altra coda che quindi può essere gestita da un servizio messaggi non elaborabili.In both samples, the objective is move the poison message out of the queue to another queue which then can be serviced by a poison message service.

Esempio di gestione dei messaggi non elaborabili di MSMQ v4.0MSMQ v4.0 Poison Handling Sample

In Windows VistaWindows Vista, MSMQ fornisce una funzionalità di coda secondaria non elaborabile che può essere usata per archiviare i messaggi non elaborabili.In Windows VistaWindows Vista, MSMQ provides a poison sub-queue facility that can be used to store poison messages. Questo esempio dimostra la procedura consigliata per gestire i messaggi non elaborabili usando Windows VistaWindows Vista.This sample demonstrates the best practice of dealing with poison messages using Windows VistaWindows Vista.

Il rilevamento dei messaggi non elaborabili in Windows VistaWindows Vista è piuttosto sofisticato.The poison message detection in Windows VistaWindows Vista is quite sophisticated. Il rilevamento è agevolato da 3 proprietà.There are 3 properties that help with detection. ReceiveRetryCount è il numero di volte che un determinato messaggio viene riletto dalla coda e inviato all'applicazione per l'elaborazione.The ReceiveRetryCount is number of times a given message is re-read from the queue and dispatched to the application for processing. Un messaggio viene riletto dalla coda quando è inserito di nuovo nella coda perché non può essere inviato all'applicazione o l'applicazione esegue il rollback della transazione nell'operazione del servizio.A message is re-read from the queue when it is put back into the queue because the message cannot be dispatched to the application or the application rolls back the transaction in the service operation. MaxRetryCycles è il numero di volte che il messaggio viene spostato nella coda di tentativi.MaxRetryCycles is the number of times the message is moved to the retry queue. Quando viene raggiunto ReceiveRetryCount, il messaggio viene spostato nella coda di tentativi.When ReceiveRetryCount is reached, the message is moved to the retry queue. La proprietà RetryCycleDelay è l'intervallo di tempo dopo il quale il messaggio viene spostato dalla coda di tentativi alla coda principale.The property RetryCycleDelay is the time delay after which the message is moved from the retry queue back to the main queue. ReceiveRetryCount viene reimpostato su 0.The ReceiveRetryCount is reset to 0. Viene eseguito un nuovo tentativo per il messaggio.The message is tried again. Se tutti i tentativi di leggere il messaggio non sono riusciti, il messaggio è contrassegnato come non elaborabile.If all attempts to read the message have failed, then the message is marked as poisoned.

Una volta il messaggio è contrassegnato come non elaborabile, viene gestito in base alle impostazioni nell'enumerazione ReceiveErrorHandling.Once the message is marked as poisoned, the message is dealt with according to the settings in the ReceiveErrorHandling enumeration. Per reiterare i valori possibili:To reiterate the possible values:

  • Fault (impostazione predefinita): per determinare l'errore del listener e anche dell'host del servizio.Fault (default): To fault the listener and also the service host.

  • Drop: per rilasciare il messaggio.Drop: To drop the message.

  • Move: per spostare il messaggio nella coda secondaria di messaggi non elaborabili.Move: To move the message to the poison message sub-queue. Questo valore è disponibile solo in Windows VistaWindows Vista.This value is available only on Windows VistaWindows Vista.

  • Reject: per rifiutare il messaggio, rispedendolo alla coda di messaggi non recapitabili del mittente.Reject: To reject the message, sending the message back to the sender's dead-letter queue. Questo valore è disponibile solo in Windows VistaWindows Vista.This value is available only on Windows VistaWindows Vista.

Nell'esempio viene mostrato l'uso della disposizione Move per il messaggio non elaborabile.The sample demonstrates using the Move disposition for the poison message. Move determina lo spostamento del messaggio nella coda secondaria non elaborabile.Move causes the message to move to the poison sub-queue.

Il contratto di servizio è IOrderProcessorche definisce un servizio unidirezionale adatto per l'uso con le code.The service contract is IOrderProcessor, which defines a one-way service that is suitable for use with queues.

[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]  
public interface IOrderProcessor  
{  
    [OperationContract(IsOneWay = true)]  
    void SubmitPurchaseOrder(PurchaseOrder po);  
}  

L'operazione del servizio visualizza un messaggio indicante che l'ordine è in fase di elaborazione.The service operation displays a message stating it is processing the order. Per dimostrare la funzionalità dei messaggi non elaborabili l'operazione del servizio SubmitPurchaseOrder genera un'eccezione per eseguire il rollback della transazione in una chiamata casuale del servizio.To demonstrate the poison message functionality, the SubmitPurchaseOrder service operation throws an exception to rollback the transaction on a random invocation of the service. Questo fa in modo che il messaggio venga rimesso nella coda.This causes the message to be put back in the queue. Eventualmente il messaggio viene contrassegnato come non elaborabile.Eventually the message is marked as poison. La configurazione è impostata per spostare il messaggio non elaborabile nella coda secondaria non elaborabile.The configuration is set to move the poison message to the poison sub-queue.

// Service class that implements the service contract.  
// Added code to write output to the console window.  
public class OrderProcessorService : IOrderProcessor  
{  
    static Random r = new Random(137);  

    [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]  
    public void SubmitPurchaseOrder(PurchaseOrder po)  
    {  

        int randomNumber = r.Next(10);  

        if (randomNumber % 2 == 0)  
        {  
            Orders.Add(po);  
            Console.WriteLine("Processing {0} ", po);  
        }  
        else  
        {  
            Console.WriteLine("Aborting transaction, cannot process purchase order: " + po.PONumber);  
            Console.WriteLine();  
            throw new Exception("Cannot process purchase order: " + po.PONumber);  
        }  
    }  

    public static void OnServiceFaulted(object sender, EventArgs e)   
    {  
        Console.WriteLine("Service Faulted");  
    }  

    // Host the service within this EXE console application.  
    public static void Main()  
    {  
        // Get MSMQ queue name from app settings in configuration.  
        string queueName = ConfigurationManager.AppSettings["queueName"];  

        // Create the transacted MSMQ queue if necessary.  
        if (!System.Messaging.MessageQueue.Exists(queueName))  
            System.Messaging.MessageQueue.Create(queueName, true);  

        // Get the base address that is used to listen for WS-MetaDataExchange requests.  
        // This is useful to generate a proxy for the client.  
        string baseAddress = ConfigurationManager.AppSettings["baseAddress"];  

        // Create a ServiceHost for the OrderProcessorService type.  
        ServiceHost serviceHost = new ServiceHost(typeof(OrderProcessorService), new Uri(baseAddress));  

        // Hook on to the service host faulted events.  
        serviceHost.Faulted += new EventHandler(OnServiceFaulted);  

        // Open the ServiceHostBase to create listeners and start listening for messages.  
        serviceHost.Open();  

        // The service can now be accessed.  
        Console.WriteLine("The service is ready.");  
        Console.WriteLine("Press <ENTER> to terminate service.");  
        Console.WriteLine();  
        Console.ReadLine();  

        if(serviceHost.State != CommunicationState.Faulted) {  
            serviceHost.Close();  
        }  

    }  
}  

La configurazione del servizio comprende le seguenti proprietà dei messaggi non elaborabili: receiveRetryCount, maxRetryCycles, retryCycleDelay e receiveErrorHandling come è illustrato nel file di configurazione seguente.The service configuration includes the following poison message properties: receiveRetryCount, maxRetryCycles, retryCycleDelay, and receiveErrorHandling as shown in the following configuration file.

<?xml version="1.0" encoding="utf-8" ?>  
<configuration>  
  <appSettings>  
    <!-- Use appSetting to configure MSMQ queue name. -->  
    <add key="queueName" value=".\private$\ServiceModelSamplesPoison" />  
    <add key="baseAddress" value="http://localhost:8000/orderProcessor/poisonSample"/>  
  </appSettings>  
  <system.serviceModel>  
    <services>  
      <service   
              name="Microsoft.ServiceModel.Samples.OrderProcessorService">  
        <!-- Define NetMsmqEndpoint -->  
        <endpoint address="net.msmq://localhost/private/ServiceModelSamplesPoison"  
                  binding="netMsmqBinding"  
                  bindingConfiguration="PoisonBinding"   
                  contract="Microsoft.ServiceModel.Samples.IOrderProcessor" />  
      </service>  
    </services>  

    <bindings>  
      <netMsmqBinding>  
        <binding name="PoisonBinding"   
                 receiveRetryCount="0"  
                 maxRetryCycles="1"  
                 retryCycleDelay="00:00:05"                        
                 receiveErrorHandling="Move">  
        </binding>  
      </netMsmqBinding>  
    </bindings>  
  </system.serviceModel>  
</configuration>  

Elaborazione dei messaggi dalla coda di messaggi non elaborabiliProcessing messages from the poison message queue

Il servizio messaggi non elaborabili legge i messaggi dalla coda finale di messaggi non elaborabili e li elabora.The poison message service reads messages from the final poison message queue and processes them.

I messaggi nella coda di messaggi non elaborabili sono indirizzati al servizio che sta elaborando il messaggio, il quale può essere diverso dall'endpoint del servizio messaggi non elaborabili.Messages in the poison message queue are messages that are addressed to the service that is processing the message, which could be different from the poison message service endpoint. Pertanto, quando il servizio messaggi non elaborabili legge messaggi dalla coda, il livello del canale WCF trova la mancata corrispondenza negli endpoint e non invia il messaggio.Therefore, when the poison message service reads messages from the queue, the WCF channel layer finds the mismatch in endpoints and does not dispatch the message. In questo caso, il messaggio è indirizzato al servizio di elaborazione ordini ma viene ricevuto dal servizio messaggi non elaborabili.In this case, the message is addressed to the order processing service but is being received by the poison message service. Per continuare a ricevere il messaggio anche se è indirizzato a un endpoint diverso, è necessario aggiungere un ServiceBehavior per filtrare gli indirizzi nei quali il criterio di corrispondenza è qualsiasi endpoint del servizio al quale il messaggio è indirizzato.To continue to receive the message even if the message is addressed to a different endpoint, we must add a ServiceBehavior to filter addresses where the match criterion is to match any service endpoint the message is addressed to. Questo è necessario per elaborare correttamente i messaggi che vengono letti dalla coda di messaggi non elaborabili.This is required to successfully process messages that you read from the poison message queue.

L'implementazione stessa del servizio messaggi non elaborabili è molto simile all'implementazione del servizio.The poison message service implementation itself is very similar to the service implementation. Implementa il contratto ed elabora gli ordini.It implements the contract and processes the orders. Di seguito è riportato l'esempio di codice completo:The code example is as follows.

// Service class that implements the service contract.  
// Added code to write output to the console window.  
[ServiceBehavior(AddressFilterMode=AddressFilterMode.Any)]  
public class OrderProcessorService : IOrderProcessor  
{  
    [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]  
    public void SubmitPurchaseOrder(PurchaseOrder po)  
    {  
        Orders.Add(po);  
        Console.WriteLine("Processing {0} ", po);  
    }  

    public static void OnServiceFaulted(object sender, EventArgs e)   
    {  
        Console.WriteLine("Service Faulted...exiting app");  
        Environment.Exit(1);  
    }  

    // Host the service within this EXE console application.  
    public static void Main()  
    {  

        // Create a ServiceHost for the OrderProcessorService type.  
        ServiceHost serviceHost = new ServiceHost(typeof(OrderProcessorService));  

        // Hook on to the service host faulted events.  
        serviceHost.Faulted += new EventHandler(OnServiceFaulted);  

        serviceHost.Open();  

        // The service can now be accessed.  
        Console.WriteLine("The poison message service is ready.");  
        Console.WriteLine("Press <ENTER> to terminate service.");  
        Console.WriteLine();  
        Console.ReadLine();  

        // Close the ServiceHostBase to shutdown the service.  
        if(serviceHost.State != CommunicationState.Faulted)  
        {  
            serviceHost.Close();  
        }  
    }  

Diversamente dal servizio di elaborazione ordini che legge i messaggi dalla coda degli ordini, il servizio messaggi non elaborabili legge i messaggi dalla coda secondaria non elaborabile.Unlike the order processing service that reads messages from the order queue, the poison message service reads messages from the poison sub-queue. La coda non elaborabile è una coda secondaria della coda principale, denominata "non elaborabile" ed è generata automaticamente da MSMQ.The poison queue is a sub-queue of the main queue, is named "poison" and is automatically generated by MSMQ. Per accedervi, fornire il nome della coda principale seguito da un "," e il nome della coda secondaria, in questo caso -"poison", come illustrato nella configurazione di esempio seguente.To access it, provide the main queue name followed by a ";" and the sub-queue name, in this case -"poison", as shown in the following sample configuration.

Nota

Nell'esempio per MSMQ v3.0, il nome della coda non elaborabile non è una coda secondaria, ma la coda nella quale viene spostato il messaggio.In the sample for MSMQ v3.0, the poison queue name is not a sub-queue, rather the queue that we moved the message to.

<?xml version="1.0" encoding="utf-8" ?>  
<configuration>  
  <system.serviceModel>  
    <services>  
      <service name="Microsoft.ServiceModel.Samples.OrderProcessorService">  
        <!-- Define NetMsmqEndpoint -->  
        <endpoint address="net.msmq://localhost/private/ServiceModelSamplesPoison;poison"  
                  binding="netMsmqBinding"  
                  contract="Microsoft.ServiceModel.Samples.IOrderProcessor" >  
        </endpoint>  
      </service>  
    </services>  

  </system.serviceModel>  
</configuration>  

Quando si esegue l'esempio, le attività del client, del servizio e del servizio messaggi non elaborabili vengono visualizzate nelle finestre della console.When you run the sample, the client, service, and poison message service activities are displayed in console windows. È possibile osservare il servizio che riceve i messaggi dal client.You can see the service receive messages from the client. Premere INVIO in ciascuna finestra della console per arrestare i servizi.Press ENTER in each console window to shut down the services.

Il servizio avvia l'esecuzione, elaborando gli ordini e in modo casuale inizia a terminare l'elaborazione.The service starts running, processing orders and at random starts to terminate processing. Se il messaggio indica che ha elaborato l'ordine, è possibile eseguire di nuovo il client per inviare un altro messaggio finché non si nota che il servizio ha effettivamente terminato un messaggio.If the message indicates it has processed the order, you can run the client again to send another message until you see the service has actually terminated a message. In base alle impostazioni dei messaggi non elaborabili configurate, l'elaborazione del messaggio viene tentata una volta prima che questo venga rimosso dalla coda finale non elaborabile.Based on the configured poison settings, the message is tried once for processing before moving it to the final poison queue.

The service is ready.  
Press <ENTER> to terminate service.  

Processing Purchase Order: 0f063b71-93e0-42a1-aa3b-bca6c7a89546  
        Customer: somecustomer.com  
        OrderDetails  
                Order LineItem: 54 of Blue Widget @unit price: $29.99  
                Order LineItem: 890 of Red Widget @unit price: $45.89  
        Total cost of this order: $42461.56  
        Order status: Pending  

Processing Purchase Order: 5ef9a4fa-5a30-4175-b455-2fb1396095fa  
        Customer: somecustomer.com  
        OrderDetails  
                Order LineItem: 54 of Blue Widget @unit price: $29.99  
                Order LineItem: 890 of Red Widget @unit price: $45.89  
        Total cost of this order: $42461.56  
        Order status: Pending  

Aborting transaction, cannot process purchase order: 23e0b991-fbf9-4438-a0e2-20adf93a4f89  

Avviare il servizio messaggi non elaborabili per leggere il messaggio non elaborabile dalla coda non elaborabile.Start up the poison message service to read the poisoned message from the poison queue. In questo esempio, il servizio messaggi non elaborabili legge il messaggio e lo elabora.In this example, the poison message service reads the message and processes it. È possibile osservare che l'ordine di acquisto terminato e impostato come non elaborabile viene letto dal servizio messaggi non elaborabili.You could see that the purchase order that was terminated and poisoned is read by the poison message service.

The service is ready.  
Press <ENTER> to terminate service.  

Processing Purchase Order: 23e0b991-fbf9-4438-a0e2-20adf93a4f89  
        Customer: somecustomer.com  
        OrderDetails  
                Order LineItem: 54 of Blue Widget @unit price: $29.99  
                Order LineItem: 890 of Red Widget @unit price: $45.89  
        Total cost of this order: $42461.56  
        Order status: Pending  

Per impostare, compilare ed eseguire l'esempioTo set up, build, and run the sample

  1. Assicurarsi di avere eseguito la procedura di installazione singola per gli esempi di Windows Communication Foundation.Ensure that you have performed the One-Time Setup Procedure for the Windows Communication Foundation Samples.

  2. Se il servizio viene eseguito prima, verificherà la presenza della coda.If the service is run first, it will check to ensure that the queue is present. Se la coda non è presente, il servizio ne creerà una.If the queue is not present, the service will create one. È possibile eseguire il servizio prima per creare la coda oppure è possibile crearne una tramite il gestore code MSMQ.You can run the service first to create the queue, or you can create one via the MSMQ Queue Manager. Per creare una coda in Windows 2008, eseguire i passaggi riportati di seguito.Follow these steps to create a queue in Windows 2008.

    1. Aprire Server Manager in Visual Studio 2012Visual Studio 2012.Open Server Manager in Visual Studio 2012Visual Studio 2012.

    2. Espandere il funzionalità scheda.Expand the Features tab.

    3. Fare doppio clic su code Privatee selezionare New, coda privata.Right-click Private Message Queues, and select New, Private Queue.

    4. Controllare il transazionale casella.Check the Transactional box.

    5. Immettere ServiceModelSamplesTransacted come il nome della nuova coda.Enter ServiceModelSamplesTransacted as the name of the new queue.

  3. Per compilare l'edizione in C# o Visual Basic .NET della soluzione, seguire le istruzioni in Building the Windows Communication Foundation Samples.To build the C# or Visual Basic .NET edition of the solution, follow the instructions in Building the Windows Communication Foundation Samples.

  4. Per eseguire l'esempio in una configurazione a una o più computer, modificare i nomi di coda per riflettere l'effettivo nome host anziché localhost e seguire le istruzioni in esegue gli esempi di Windows Communication Foundation.To run the sample in a single- or cross-computer configuration, change the queue names to reflect the actual hostname instead of localhost and follow the instructions in Running the Windows Communication Foundation Samples.

Per impostazione predefinita con il trasporto dell'associazione netMsmqBinding è abilitata la sicurezza.By default with the netMsmqBinding binding transport, security is enabled. Il tipo di sicurezza del trasporto è determinato da due proprietà, MsmqAuthenticationMode e MsmqProtectionLevel.Two properties, MsmqAuthenticationMode and MsmqProtectionLevel, together determine the type of transport security. Per impostazione predefinita, la modalità di autenticazione è impostata su Windows e il livello di protezione è impostato su Sign.By default, the authentication mode is set to Windows and the protection level is set to Sign. Affinché MSMQ fornisca la funzionalità di autenticazione e firma, deve appartenere a un dominio.For MSMQ to provide the authentication and signing feature, it must be part of a domain. Se si esegue questo esempio in un computer che non appartiene a un dominio, si riceve l'errore seguente: "Il certificato interno del servizio di accodamento messaggi non esiste".If you run this sample on a computer that is not part of a domain, you receive the following error: "User's internal message queuing certificate does not exist".

Per eseguire l'esempio in un computer appartenente a un gruppo di lavoroTo run the sample on a computer joined to a workgroup

  1. Se il computer non appartiene a un dominio, disattivare la sicurezza del trasporto impostando la modalità di autenticazione e livello di protezione su None come illustrato nella configurazione di esempio seguente:If your computer is not part of a domain, turn off transport security by setting the authentication mode and protection level to None as shown in the following sample configuration:

    <bindings>  
        <netMsmqBinding>  
            <binding name="TransactedBinding">  
                <security mode="None"/>  
            </binding>  
        </netMsmqBinding>  
    </bindings>  
    

    Verificare che l'endpoint sia associato al binding impostando l'attributo bindingConfiguration dell'endpoint.Ensure the endpoint is associated with the binding by setting the endpoint's bindingConfiguration attribute.

  2. Assicurarsi di modificare la configurazione in PoisonMessageServer, sul server e sul client prima che di eseguire l'esempio.Ensure that you change the configuration on the PoisonMessageServer, server and the client before you run the sample.

    Nota

    L'impostazione di security mode su None è equivalente all'impostazione di MsmqAuthenticationMode, MsmqProtectionLevel e della sicurezza Message su None.Setting security mode to None is equivalent to setting MsmqAuthenticationMode, MsmqProtectionLevel, and Message security to None.

  3. Affinché Metadata Exchange funzioni, registriamo un URL con associazione HTTP.In order for Meta Data Exchange to work, we register a URL with http binding. Ciò richiede che il servizio venga eseguito in una finestra di comando elevata.This requires that the service run in an elevated command window. In caso contrario, si ottiene un'eccezione quale: eccezione non gestita: AddressAccessDeniedException: HTTP non è stato possibile registrare l'URL http://+:8000/ServiceModelSamples/service/.Otherwise, you get an exception such as: Unhandled Exception: System.ServiceModel.AddressAccessDeniedException: HTTP could not register URL http://+:8000/ServiceModelSamples/service/. Il processo non dispone dei diritti di accesso per questo spazio dei nomi (vedere http://go.microsoft.com/fwlink/?LinkId=70353 per informazioni dettagliate).Your process does not have access rights to this namespace (see http://go.microsoft.com/fwlink/?LinkId=70353 for details). ---> System.Net.HttpListenerException: Accesso negato.---> System.Net.HttpListenerException: Access is denied.

Importante

È possibile che gli esempi siano già installati nel computer.The samples may already be installed on your computer. 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\WCF\Basic\Binding\Net\MSMQ\Poison\MSMQ4

Vedere ancheSee Also