Integrieren von Enterprise Services-Transaktionskomponenten
Windows Communication Foundation (WCF) stellt einen automatischen Mechanismus zur Integration mit Enterprise Services bereit (siehe Integrieren von COM+-Anwendungen). Möglicherweise benötigen Sie die Flexibilität zur Entwicklung von Diensten, die von Enterprise Services gehostete Transaktionskomponenten intern verwenden. Da die WCF-Transaktionsfunktion auf die System.Transactions-Infrastruktur aufsetzt, ist der Prozess zur Integration mit Enterprise Services mit WCF identisch mit dem Prozess zur Angabe der Interoperabilität zwischen System.Transactions und Enterprise Services, wie unter Interoperabilität mit Enterprise Services und COM+-Transaktionen (möglicherweise in englischer Sprache) beschrieben.
Um das gewünschte Maß an Interoperabilität zwischen der eingehenden übergebenden Transaktion und der COM+-Kontexttransaktion zu erzielen, muss die Dienstimplementierung eine TransactionScope-Instanz erstellen und den entsprechenden Wert der EnterpriseServicesInteropOption-Enumeration verwenden.
Integrieren von Enterprise Services mit einem Dienstvorgang
Der folgende Code veranschaulicht einen Vorgang mit zugelassenem Transaktionsfluss, der einen TransactionScope mit der Full-Option erstellt. Die folgenden Bedingungen sind in diesem Szenario gültig:
Wenn der Client eine Transaktion übergibt, wird der Vorgang, einschließlich des Aufrufs der Enterprise Services-Komponente, innerhalb des Umfangs dieser Transaktion ausgeführt. Mit Full wird sichergestellt, dass die Transaktion mit dem System.EnterpriseServices-Kontext synchronisiert wird. Dies bedeutet, dass die Ambient-Transaktion für System.Transactions und System.EnterpriseServices identisch ist.
Wenn der Client keine Transaktion übergibt, wird durch Festlegen von TransactionScopeRequired auf true ein neuer Transaktionsumfang für den Vorgang erstellt. Auf ähnliche Weise wird mit Full sichergestellt, dass die Transaktion des Vorgangs mit der Transaktion übereinstimmt, die innerhalb des Kontexts der System.EnterpriseServices-Komponente verwendet wird.
Alle zusätzlichen Methodenaufrufe treten auch innerhalb des Transaktionsumfangs des gleichen Vorgangs auf.
[ServiceContract()]
public interface ICustomerServiceContract
{
[OperationContract]
[TransactionFlow(TransactionFlowOption.Allowed)]
void UpdateCustomerNameOperation(int customerID, string newCustomerName);
}
[ServiceBehavior(TransactionIsolationLevel = System.Transactions.IsolationLevel.Serializable)]
public class CustomerService : ICustomerServiceContract
{
[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
public void UpdateCustomerNameOperation(int customerID, string newCustomerName)
{
// Create a transaction scope with full ES interop
using (TransactionScope ts = new TransactionScope(
TransactionScopeOption.Required,
new TransactionOptions(),
EnterpriseServicesInteropOption.Full))
{
// Create an Enterprise Services component
// Call UpdateCustomer method on an Enterprise Services
// component
// Call UpdateOtherCustomerData method on an Enterprise
// Services component
ts.Complete();
}
// Do UpdateAdditionalData on an non-Enterprise Services
// component
}
}
Wenn keine Synchronisierung zwischen der aktuellen Transaktion eines Vorgangs und den Aufrufen für die Transaktionskomponenten von Enterprise Services erforderlich ist, verwenden Sie die None-Option zum Instanziieren der TransactionScope-Instanz.
Integrieren von Enterprise Services mit einem Client
Der folgende Code veranschaulicht Clientcode, der eine TransactionScope-Instanz mit der Full-Einstellung verwendet. In diesem Szenario treten Aufrufe für Dienstvorgänge, die den Transaktionsfluss unterstützen, innerhalb des Umfangs derselben Transaktion auf wie die Aufrufe für Enterprise Services-Komponenten.
static void Main()
{
// Create a client
CalculatorClient client = new CalculatorClient();
// Create a transaction scope with full ES interop
using (TransactionScope ts = new TransactionScope(
TransactionScopeOption.Required,
new TransactionOptions(),
EnterpriseServicesInteropOption.Full))
{
// Call Add calculator service operation
// Create an Enterprise Services component
// Call UpdateCustomer method on an Enterprise Services
// component
ts.Complete();
}
// Closing the client gracefully closes the connection and
// cleans up resources
client.Close();
}
Siehe auch
Weitere Ressourcen
COM+ Integration: Web-Hosted
Integrieren von COM+-Anwendungen
Integrieren von COM-Anwendungen