Eliminare l'ambito della transazioneSuppress Transaction Scope

In questo esempio viene illustrato come modificare un'attività SuppressTransactionScope personalizzata per annullare la transazione di runtime di ambiente, se presente.The sample demonstrates how to author a custom SuppressTransactionScope activity to suppress the ambient run-time transaction, if present.

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\Scenario\Transactions\SuppressTransactionScope

Dettagli dell'esempioSample Details

L'attività personalizzata è utile per impedire che una transazione venga propagata a un altro servizio se il flusso della transazione risulta indesiderabile per un particolare scenario.The custom activity is useful to prevent a transaction from being flowed out to another service if transaction flow is undesirable for the particular scenario. Nell'esecuzione del flusso di lavoro è presente il supporto incorporato per eliminare la transazione di ambiente nella classe NativeActivity, ma per usare questo supporto è necessario modificare un oggetto NativeActivity personalizzato come quello usato in questo esempio.The workflow runtime has built-in support for suppressing the ambient transaction in the NativeActivity class, but to use this support it is necessary to author a custom NativeActivity such as the one in this sample.

Lo scenario è costituito da tre parti.The scenario consists of three parts. Innanzitutto, un oggetto TransactionScope crea una transazione di runtime che diventa di ambiente.First, a TransactionScope creates a run-time transaction that becomes ambient. Questa operazione viene verificata da un'attività personalizzata che stampa gli identificatori locali e distribuiti della transazione.This is verified by a custom activity that prints the local and distributed identifiers of the transaction. La transazione viene quindi propagata a un servizio remoto prima di iniziare la seconda parte.The transaction is then flowed to a remote service before beginning the second part. Durante la seconda parte, il flusso di lavoro apre un'attività SuppressTransactionScope e ripete di nuovo il processo di stampa degli identificatori della transazione e di propagazione della transazione.During the second part, the workflow enters a SuppressTransactionScope and again repeats the process of printing the transaction identifiers and flowing the transaction. L'attività personalizzata non trova tuttavia una transazione di ambiente e il messaggio propagato al servizio non contiene la transazione.However, the custom activity does not find an ambient transaction and the message flowed to the service does not contain the transaction. Di conseguenza, il servizio crea una transazione e ciò significa che l'ID distribuito stampato sul client e il servizio non corrispondono.As a result, the service creates a transaction, which means the distributed ID printed on the client and service do not match. La parte finale si verifica dopo la chiusura di SuppressTransactionScope e la transazione di runtime diventa nuovamente di ambiente, come risulta da un altro messaggio al servizio con un identificatore distribuito che corrisponde all'identificatore del primo messaggio.The final part occurs after the SuppressTransactionScope exits and the run-time transaction again becomes ambient as verified by another message to the service with a distributed identifier that matches the identifier of the first message.

L'attività stessa deriva da NativeActivity perché deve pianificare un'attività figlio e aggiungere una proprietà di esecuzione.The activity itself derives from NativeActivity because it must schedule a child activity and add an execution property. SuppressTransactionScope dispone di un oggetto Variable di tipo RuntimeTransactionHandle che deve essere usato al posto di un campo di istanza di tipo RuntimeTransactionHandle perché è necessario inizializzare l'handle.The SuppressTransactionScope has a Variable of type RuntimeTransactionHandle, which must be used rather than an instance field of type RuntimeTransactionHandle because the handle must be initialized. Variable<RuntimeTransactionHandle> viene aggiunto ai metadati dell'attività come una variabile di implementazione in quanto è usato solo internamente.The Variable<RuntimeTransactionHandle> is added to the activity’s metadata as an implementation variable because it is only used internally.

Durante l'esecuzione dell'attività, viene controllato innanzitutto se è stato specificato un corpo e, in tal caso, la proprietà SuppressTransaction viene impostata su RuntimeTransactionHandle.When the activity is executed it first checks to see whether a body was specified and if so, sets the SuppressTransaction property on the RuntimeTransactionHandle. Una volta impostata, la proprietà viene aggiunta alle proprietà di esecuzione e diventa di ambiente.Once the property is set, it is added to the execution properties and becomes ambient. Ciò significa che qualsiasi attività figlio di SuppressTransactionScope è in grado di visualizzare la proprietà, pertanto viene applicata l'eliminazione della transazione di runtime e viene generata un'eccezione da parte di un oggetto TransactionScope annidato.This means that any activity that is a child of the SuppressTransactionScope is able to see the property and therefore enforces the suppression of the run-time transaction and causes a nested TransactionScope to throw an exception. Una volta aggiunto l'handle alle proprietà di esecuzione, viene pianificata l'esecuzione del corpo.Once the handle is added to the execution properties the body is scheduled to run.

Per usare questo esempioTo use this sample

  1. Aprire la soluzione SuppressTransactionScope.sln in Visual Studio 2010Visual Studio 2010.Open the SuppressTransactionScope.sln solution in Visual Studio 2010Visual Studio 2010.

  2. Per compilare la soluzione, premere CTRL + MAIUSC + B o scegliere Compila soluzione dal compilare menu.To build the solution, press CTRL+SHIFT+B or select Build Solution from the Build menu.

  3. Una volta completata la compilazione, la soluzione e scegliere Imposta progetti di avvio.Once the build has succeeded, right-click the solution and select Set Startup Projects. Finestra di dialogo, selezionare più progetti di avvio e assicurarsi che l'azione per entrambi i progetti sia avviare.From the dialog, select Multiple Startup Projects and ensure the action for both projects is Start.

  4. Premere F5 o scegliere Avvia debug dal Debug menu.Press F5 or select Start Debugging from the Debug menu. In alternativa, è possibile premere CTRL + F5 o selezionare Avvia senza eseguire debug dal Debug menu per l'esecuzione senza debug.Alternatively, you can press CTRL+F5 or select Start Without Debugging from the Debug menu to run without debugging.

    Nota

    Il server deve essere in esecuzione prima dell'avvio del client.The server must be running prior to starting the client. L'output dalla finestra della console che ospita il servizio indica quando è stato avviato.The output from the console window that hosts the service indicates when it has started.

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\Scenario\Transactions\SuppressTransactionScope