Ich habe eine transaktionale MSMQ-Warteschlange auf dem Server THOR eingerichtet. Ich kann Nachrichten von einer Workstation mit folgendem Code an diese Warteschlange senden:
%Vor%Wenn ich jedoch versuche, eine Verbindung über WCF herzustellen, erscheinen meine Nachrichten nie in der Warteschlange. Hier ist die Konfiguration, die ich verwende:
%Vor%Und der Code:
%Vor%Ich bekomme keine Ausnahmen, aber es gibt keine Nachricht in der Warteschlange auf THOR. Irgendwelche Ideen? Ich weiß nicht einmal, wie ich das debuggen kann, da es nur im Stillen fehlschlägt.
AKTUALISIEREN
Wenn ich meinen MSMQ-URI in 'net.msmq: // localhost / private / myqueue' ändere, wird er in eine lokale Transaktionswarteschlange gestellt, die ich eingerichtet habe. Die Einrichtung der Warteschlange selbst ist identisch (ich habe dieselben Schritte ausgeführt, um sowohl die localhost- als auch die THOR-Warteschlangen zu erstellen).
Ich glaube, wenn Sie Ihre Queue-Transaktion auf der MSMQ-Server-Seite machen, müssen Sie einige weitere Einstellungen in Ihrer WCF-Bindungskonfiguration angeben - versuchen Sie dies:
%Vor% Wenn ich mich nicht irre, müssen Sie Ihrer netMsmq-Bindung die Attribute durable="true"
und exactlyOnce="true"
hinzufügen, damit dies funktioniert.
Es gibt ein wirklich gutes Tutorial, wie man MSMQ und WCF gut zusammenarbeiten lässt:
Tom behandelt Transaktionswarteschlangen in Teil 3 und erwähnt:
Das exactlyOnce="true" Attribut ist WCF-sprechen für die Verwendung einer Transaktion Nachrichtenwarteschlange.
durable=true
bedeutet nur, dass die Nachrichten sofort auf den Datenträger geschrieben werden, anstatt sie im Serverspeicher zu belassen. Es ist langsamer, aber im Falle eines Serverabsturzes oder einer Stromunterbrechung gehen Nachrichten nicht verloren. Klassischer Kompromiss zwischen Geschwindigkeit und Zuverlässigkeit ....
Update: Da Sie "über" Maschinengrenzen hinweg gehen und Transaktions-Queue verwenden - haben Sie den DTC (Distributed Transaction Coordinator) auf allen beteiligten Maschinen überprüft? Schau dir Toms Blog Teil 3 an:
Überprüfen Sie die DTC-Konfiguration
Unsere epische Reise ist fast zu Ende. In der Tat, wenn du noch mitspielst Zu Hause kannst du versuchen, die Anwendung mit der Transaktion Warteschlangen, um zu sehen, ob es funktioniert. Wenn es ist fehlgeschlagen, ist eine mögliche Ursache Probleme mit Ihrem Distributed Konfiguration des Transaktionskoordinators. Hier sind ein paar Dinge zu versuchen:
Ich hatte das gleiche Problem. Nachdem ich alle hier aufgeführten Ideen ausprobiert hatte, suchte ich nach etwas anderem. Es stellte sich heraus, dass bei Auswahl des Sicherheitsmodus Keine die Absendereigenschaften von mir leer gelassen wurden (siehe Abbildung unten).
Diese Nachricht wird akzeptiert, wenn sie an ein localhost
gesendet wird, aber vom Remote-Server abgelehnt wird.
Damit es funktioniert, haben Sie wenige Möglichkeiten:
Die erste Option ist natürlich sicherer, erfordert aber, dass MSMQ mit Active Directory-Integration installiert wird.
Ich hatte ein ähnliches Problem, also hoffe ich, dass diese Checkliste hilft:
HINWEIS: Wahrscheinlich ist 1 in Ordnung, aber nur für den Fall, dass ich es ...
Sie müssen MsmqIntegrationBinding verwenden. Die Nachrichten werden nicht erkannt und werden verworfen, da WCF nicht weiß, was sie sind.
Versuchen Sie, den Transaktionsaktionsbereich abzuschließen, bevor Sie den Kanal schließen.
Wenn Sie den Kanal schließen, verlieren Sie den Kontakt mit ihm, daher hat er eine nicht festgeschriebene Transaktion, die schließlich verworfen wird.
Tags und Links wcf .net c# msmq netmsmqbinding