Da ich einen Web/SOAP-Service habe, wie richte ich einen richtigen Transaktionskontext für Rebus (den Messaging-Bus) ein und löse ihn aus? Wenn Rebus einen Message-Handler aufruft, ist dies kein Problem, da Rebus den Transaktionskontext vor dem Aufruf des Handlers einrichten wird - aber was ist mit dem Gegenteil, wenn ein Web-Service-Handler eine Nachricht über Rebus senden/veröffentlichen muss?Wie setze ich den Rebus-Transaktionskontext für einen Web-Service?
Ich bin nicht daran interessiert, wie man ein HTTP-Modul oder ähnliches implementiert - nur die Grundlagen rund um Rebus: Was ist nötig, um Rebus für das Senden einer Nachricht vorzubereiten?
Der Web-Service-Code hat eine eigene Transaktion, wenn er mit der Anwendungsdatenbank kommuniziert. Ich muss in der Lage sein, Rebus einzurichten, wenn ich die Datenbanktransaktion einrichte und Rebus commit/rollback, wenn ich dasselbe mit der Datenbank mache.
Ich habe ein ähnliches Problem mit Standalone-Befehlszeilenprogrammen, die sowohl Interaktion mit einer Datenbank und Senden von Rebus-Nachrichten benötigt.
Dank. Es half bis zu einem gewissen Grad ... für normale synchrone ASP MVC 5 Controller-Methoden funktioniert es gut: AmbientTransactionContext.Current ist vor und nach dem Controller-Aufruf gleich. Aber wenn die Controller-Methode 'asyncTask' ist und "bus.Publish (msg) abwartet", dann ist AmbientTransactionContext.Current nach dem Controller-Aufruf NULL. AmbientTransactionContext.Current wird in einem HTTP-Modul begin/end-request verwaltet. –
"AmbientTransactionContext.Current wird in einem HTTP-Modul begin/end-request" ... Das ist wahrscheinlich nicht gut dann - ASP.NET ist bekannt, um Threads zu lustigen Zeiten zu wechseln, und anscheinend ist nicht garantiert, dass die Web-Anfrage Der Handler wird mit demselben Ausführungskontext wie das HTTP-Modul ausgeführt. Sie sollten wahrscheinlich einen anderen Ort auswählen, um den Kontext zu erstellen – mookid8000
Okay, ich habe die Idee. Refactoring jetzt um den contex in HttpContext.Current.Items zu speichern. Fragst du dich aber, ob etwas in Rebus AmbientTransactionContext.Current anzeigt und fehlschlägt? Ist der Code innerhalb von Publish() zwei verschiedene Transaktionen, wenn ich zwei Bus.Publish() in einer Anfrage mache? –