Jeder hier einen fantastischen Job bei der Bereitstellung von Lösungen getan hat, und dieses Problem gerade beendet haben, kämpfen selbst ich in meinem eigenen 2c werfen wollte und zeigen die Lösung Ich dachte, das funktioniert sehr gut.
Erstens, wenn die Warteschlange ich sicherstellen, dass ich erstellt die Berechtigungen öffnen sich wie so (ich bin über Warteschlange Sicherheit im Rahmen unserer Anwendung nicht betroffen ... dies ist eine kalkulierte Entscheidung):
queue.SetPermissions("Everyone", MessageQueueAccessRights.FullControl, AccessControlEntryType.Set);
Ohne diese Zeile würde ich alle möglichen unzugänglichen Fehler erhalten und konnte nicht einmal die Warteschlange von der Computer-Management-Bildschirm durchsuchen.Nebenbei bemerkt, wenn das passiert Ihnen und Sie sich fragen, wie die Schlange zu töten, die Sie haben keinen Zugriff auf nur:
- Beenden Sie den Dienst „Message Queuing“
- Goto „C: \ Windows \ System32 \ mSMQ \ storage \ lqs“
- Öffnen sie jede Datei in Notepad und suchen sie die Queue-Namen (es wird höchstwahrscheinlich die Datei sein, die zuletzt geändert wurde)
- diese Datei löschen und den Messaging-Dienst
neu starten
Erstellen Sie eine Basisklasse f oder Ihre Warteschlangennachrichten und markieren Sie sie [Serializable]. Auf Antrag Last-Cache eine Liste aller Nachrichtentypen so etwas wie dies mit:
var types = typeof(QueueItemBase).Assembly
.GetTypes()
.Where(t => typeof(QueueItemBase).IsAssignableFrom(t) && t.IsAbstract == false)
.ToArray();
...
// Create and cache a message formatter instance
_messageFormatter = new XmlMessageFormatter(types);
Jetzt können Sie den Empfang von Nachrichten zu beginnen. Mein erster Instinkt war, nach Nachrichten zu suchen, aber die API mag es nicht, so zu arbeiten. Also erstelle ich einen Hintergrund-Thread und rufe die Blockierungsmethode Empfangen in der Warteschlange auf, die zurückkehrt, sobald eine Nachricht verfügbar ist. Von dort aus der Nachricht Dekodierung ist so einfach wie:
var message = queue.Receive();
if (message == null)
continue;
// Tell the message about our formatter containing all our message types before we
// try and deserialise
message.Formatter = _messageFormatter;
var item = message.Body as QueueItemBase;
Und das sollte alles, was Sie benötigen, um gut umgesetzt, typsicher MSMQ Integration sein!
Perfekt! Genau was ich wollte. – NLV