Ich entwickle eine wcf-basierte Lösung für eine Webservice-Schicht, die "gelegentlich verbundene" mobile Geräte verwenden. Der Dienst verwendet (zu diesem Zeitpunkt) aufgrund der zusätzlichen Komplexität keine Warteschlangen und verwendet stattdessen einen einfachen Anforderungs- / Antwortansatz.
Als mobiles Gerät ist es natürlich möglich, dass die Geräte während des Einfügens / Aktualisierens das Signal verlieren. Der Webservice selbst hat die Transaktion möglicherweise abgeschlossen, der Client erhält diese Nachricht jedoch nie. Aus diesem Grund wird die Anforderung erneut gesendet. Zu diesem Zeitpunkt muss der Server dies als doppelte Anforderung erkennen und dieselbe Antwort zurückgeben, die er bei der ersten Instanz versucht hat.
Daher versuche ich, die Dienste Idempotent zu machen. Um dies zu erreichen, implementiere ich DTO-Objekte für Anforderungsparameter, die aus der RequestID und den zum Abschließen des Aufrufs erforderlichen Parametern bestehen.
Meine Schwierigkeit besteht jedoch darin, eine Methode zur Überwachung der Anforderungs-IDs zu implementieren. Da der Dienst derzeit zustandslos ist, kann ich mir derzeit nur eine ServiceRequest-Tabelle in der Datenbank vorstellen, die die RequestID als primäre Tabelle verwendet. Wenn Sie dies abfragen, wird offensichtlich angezeigt, ob die Anforderung bereits bearbeitet wurde, da der Client dieselbe Anforderungs-ID sendet. Der Dienst muss jedoch auch wissen, welche Nachricht zurückgesendet werden soll. Im Falle einer Einfügung / Aktualisierung muss die betroffene aggregierte Stamm-ID auch irgendwo gespeichert werden, entweder direkt in der Anforderungstabelle oder in einer RequestToObjectLookup-Tabelle
Ich frage mich also, ob es eine bewährte Methode zur Implementierung gibt. Meine Gedanken sind eine ServiceRequest-Tabelle (dienstspezifisch), in der Anforderungs-IDs, zusätzliche Informationen und auch eine Suche nach der Ergebnisobjekt-ID (beim Speichern / Einfügen / Aktualisieren) gespeichert sind. Wenn also eine neue Anforderung eingeht, kann diese Tabelle zuerst konsultiert werden, bevor mit dem Rest der Anforderung fortgefahren wird, um das Speichern durchzuführen oder einfach das zuvor aktualisierte Objekt zurückzugeben (das beim ersten Anforderungsversuch ausgeführt wurde).
Ich denke auch (wie angegeben), dass ich nur die Root-Aggregat-ID behalten muss, auf die mit der Anfrage verwiesen wird, da ich nur Beziehungen verwenden sollte, um den Rest der Informationen zu erhalten.
quelle