2009-08-20 6 views
1

Ich verwende C# unter Windows Server 2008, und ich möchte eine Nachricht von einer öffentlichen Transaktions-Warteschlange auf einem anderen Computer in der gleichen Domäne erhalten. Der Fehler sieht wie folgt aus:Warum kann ich keine Nachricht von meiner öffentlichen Warteschlange für öffentliche Transaktionen erhalten?

System.Messaging.MessageQueueException: Cannot import the transaction. 
    at System.Messaging.MessageQueue.ReceiveCurrent(TimeSpan timeout, Int32 action, CursorHandle cursor, MessagePropertyFilter filter, MessageQueueTransaction internalTransaction, MessageQueueTransactionType transactionType) 
    at System.Messaging.MessageQueue.Receive(TimeSpan timeout, MessageQueueTransactionType transactionType) 
    at JobManagerLib.JobProcessor.Process(Action waitForNewMessageCallback) in C:\Dev\OtherProjects\POC\WindowsService\JobManagerSample\JobManagerLib\JobProcessor.cs:line 132 

ich DTCPing versucht haben, die in einer Richtung gelingt aber nicht in der anderen. Hier ist der relevante Teil des Protokolls:

++++++++++++hosts  ++++++++++++ 
127.0.0.1  localhost 
::1    localhost 

08-20, 15:47:22.739-->Error(0x424) at clutil.cpp @256 
08-20, 15:47:22.739-->-->OpenCluster 
08-20, 15:47:22.739-->-->1060(The specified service does not exist as an installed service.) 
++++++++++++++++++++++++++++++++++++++++++++++ 
    DTCping 1.9 Report for DEV-MSMQ2 
++++++++++++++++++++++++++++++++++++++++++++++ 
RPC server is ready 
++++++++++++Validating Remote Computer Name++++++++++++ 
08-20, 15:47:26.207-->Start DTC connection test 
Name Resolution: 
    dev-msmq1-->192.168.22.11-->Dev-msmq1 
08-20, 15:47:26.222-->Start RPC test (DEV-MSMQ2-->dev-msmq1) 
RPC test failed 

Hat jemand eine Idee, warum dies fehlschlagen könnte? Die Windows-Firewall wurde für MSDTC geöffnet. Es ist schwer, viele Informationen über Windows 2008 und MSMQ zu finden.

BEARBEITEN: Die Warteschlangennamen sind FormatName: DIRECT = Betriebssystem: dev-msmq1 \ getmap und FormatName: DIRECT = OS: dev-msmq1 \ logevent. Sie sind öffentliche Transaktions-Queues, und Jeder hat peek/erhalten Erlaubnis für sie. Der zugehörige Teil meines Code ist wie folgt:

using (TransactionScope tx = new TransactionScope(TransactionScopeOption.RequiresNew)) 
{ 
    using (var queue = new MessageQueue(QueueName)) 
    { 
     queue.Formatter = new XmlMessageFormatter(new string[] { _targetParameterType }); 
     var message = queue.Receive(TimeOut, MessageQueueTransactionType.Automatic); 
     string messageId = message.Label; 

... 
    } 
} 

Dank

+0

Vielleicht posten Sie Ihren Code oder Ihre Warteschlangenkonfiguration. MSMQ kann bei der Formatierung des Warteschlangennamens wählerisch sein. – Web

+0

Aber was sind die tatsächlichen Namen? (http://technet.microsoft.com/en-us/library/cc778392(WS.10).aspx). Obwohl ich denke, dass es sich auf die Transaktionen bezieht. (MSDTC). Habe das aber nie benutzt. Es tut uns leid. –

+0

Sorry ... Warteschlangennamen, die hier verwendet werden, sind FormatName: DIRECT = Betriebssystem: dev-msmq1 \ SendEmail und FormatName: DIRECT = OS: dev-msmq1 \ LogEvent. –

Antwort

1

Also habe ich eine Lösung gefunden: das Ganze komplett aufgeben und auf WCF und die net.Msmq Bindung umsteigen. Jetzt funktioniert die Warteschlangenkommunikation einwandfrei.

0

Beiden Maschinen müssen MSDTC ausgeführt werden, da eine Ferntransaktion im Spiel ist.

This blog article offers a tiny hint...

Da eine Firewall im Spiel sein kann, stellen Sie sicher, dass Port 1801 (MSMQ) auf beiden Seiten offen ist.

+0

Beide genannten Maschinen laufen tatsächlich MSDTC. Irgendwelche anderen Ideen? –

0

Vergewissern Sie sich, dass beide Uhren der Maschine synchron sind. Ich habe das schon mal gesehen, wo die Authentifizierung fehlschlägt, weil der Server und der Client um eine Minute aus sind. Dies geschieht auch dann, wenn die Warteschlangen öffentlich sind und Berechtigungen für alle Benutzer haben.

0

Nur der Vollständigkeit halber, so dass nur MSDTC und MSMQ durch die Firewall nicht genug ist, wenn IPv4 läuft:

Sie müssen ICMP-Datenverkehr durch die Firewall lassen als auch (IPv6 kann Hostnamen unabhängig von der Firewall beheben, aber Ihr DTCPIng-Protokoll zeigt an, dass Sie IPv4 ausführen).

Ich habe mit dem gleichen Fehler gekämpft, den Sie in DTCPing sehen, und in meinem Fall hat sich herausgestellt, dass die Firewall den ICMP-Verkehr blockiert.

Verwandte Themen