Wie kann ich die WCF-Transaktionsunterstützung für benutzerdefinierte Klassen mit CoreService implementieren?

8

Ich habe eine Klasse geschrieben, um beim Hinzufügen von & amp; Entfernen von Zielen zu einem Publikationsziel mithilfe des Core Service. Ziele werden normalerweise als Zeichenfolge (mit XML-Inhalt) über den Core-Dienst verfügbar gemacht, also habe ich eigene Wrappers dazu geschrieben usw ..

Ich habe jetzt eine Situation, in der ich zwei Publikationsziele aktualisieren muss und dachte, es wäre cool, einen Transaktionsbereich zu verwenden, um sicherzustellen, dass beide Ziele gleichzeitig aktualisiert werden.

Ich habe jedoch Schwierigkeiten damit, dies umzusetzen.

Code funktioniert (mit Standard-CoreService WCF-Client):

%Vor%

Das Ausführen dieses Codes führt zu einem erfolgreichen Rollback der Änderungen, die ich vorgenommen habe (wenn ich vor scope.Dispose() breche und die Publikationsziele in Tridion überprüfe, wird das Ziel erfolgreich geändert und dann die Änderung rückgängig gemacht).

Wenn ich jetzt versuche, meine "erweiterte Publikationsziel" -Klasse auch in einer Transaktion zu verwenden, kann ich sie nicht entsorgen.

%Vor%

Im Grunde genommen ist dies die Frage: Was muss ich tun, um meiner .Save () - Methode eine Transaktionalität hinzuzufügen?

Ich habe es versucht:

%Vor%

Aber es machte keinen Unterschied. Gibt es eine Möglichkeit festzustellen, ob ich gerade in einer Transaktion bin und diese Transaktion irgendwie "verwende"? Ich möchte keine Transaktion benötigen, sondern nur die Möglichkeit haben, in einer zu arbeiten.

Danke und Entschuldigung für die sehr lange Post ... wollte sicherstellen, dass ich so viele Informationen wie möglich zur Verfügung gestellt.

    
Nuno Linhares 13.09.2012, 00:55
quelle

1 Antwort

3

Die beste Quelle für diese ist: WCF Transaktion Propagation

Sie vermissen mindestens einen Schritt. Sie müssen auch Transaktionen in der Bindung aktivieren:

%Vor%
  

Gibt es eine Möglichkeit festzustellen, ob ich gerade in einer Transaktion bin und   irgendwie "verwenden" diese Transaktion?

Ja. Um festzustellen, ob Sie in einer Transaktion sind, können Sie Transaction.Current überprüfen. Wenn Sie sich in einer Transaktion befinden, verwenden Sie sie, es sei denn, Sie haben dies ausdrücklich abgelehnt. Das ist das Schöne / Schreckliche an Ambient-Transaktionen.

5 in WCF Transaktion Propagation :

%Vor%

Wenn Transaction.Current.TransactionInformation.DistributedIdentifier leer ist, dann wird die Transaktion lokale und „fließt“ nicht. Beachten Sie, dass in einer TransactionFlowOptions.Allowed -Konfiguration die Transaktion nicht erfolgreich ausgeführt werden kann, wenn die Transaktion fehlschlägt. Das ist also wirklich die einzige Möglichkeit zu überprüfen ... und nicht fließend passiert leichter als Sie erwarten würden.

Als ich tranactions für eine Produktion Dienst verwenden ich eigentlich TransactionFlowOptions.Allowed vermieden, weil der Anrufer nie sicher war, ob die Transaktion tatsächlich geflossen ist. Wenn es einen verbindlichen Konfigurationsfehler in der Bereitstellung gab, würde alles problemlos ausgeführt werden, aber Rollbacks fehlschlagen ... ein sehr tendious Fehler zu erkennen. Also wechselte ich auf erforderlich. Dann könnte ein -Aufrufer sicherstellen, dass die von ihnen bereitgestellte Transaktion tatsächlich erfolgreich übergeben wurde. (Wenn die Transaktion nicht in einer TransactionFlowOptions.Required -Konfiguration fließt, erhalten Sie eine Ausnahme.)

    
ErnieL 13.09.2012, 17:41
quelle

Tags und Links