2016-06-17 45 views
0

Mein MSMQ befindet sich auf einem Remotecomputer. Mein Code ist wie folgt,MSMQ OnReceiveCompleted-Methode - Queue.Body löst InvalIOperationException aus

private void OnReceiveCompleted(object sender, ReceiveCompletedEventArgs e) 
    { 
     System.Messaging.Message msg = _queue.EndReceive(e.AsyncResult); 

     FireReceiveEvent(msg.Body); // Here msg.Body throws exception 

     _queue.BeginReceive(); 
    } 

ich das als Windows-Dienst laufen ließe, nicht sicher, ob das einen Unterschied macht. Aber msg.Body löst eine InvaliOperationException aus.

Infact die meisten Eigenschaften der msg werfen Ausnahmen. Irgendeine Idee? here is a screen shot

Antwort

0

Warum versuchen Sie nicht Casting Quellenparameter wie Message

private void MessageQueueReceiveCompleted(Object source, ReceiveCompletedEventArgs asyncReceive) 
{ 
    try 
    { 
     //Get a handle to the Message Queue 
     MessageQueue messageQueue = (MessageQueue)source; 
     Message message = messageQueue.EndReceive(asyncReceive.AsyncResult); 

     if (message != null) 
     { 
      ProcessMsmqMessage(message.Body); 
     } 

    } 
    catch (Exception e) 
    { 
     Exception err = new Exception(String.Format("Error in QueueListener: {0}. Detail: {1}", queueName, e.Message), e); 
     OnListeningError(err); 
    } 
    finally{ 
     messageQueue.BeginReceive(); 
    } 
} 
+0

Hat nicht funktioniert. Der einzige Unterschied ist mein _queue ist ein Klassenmitglied, während Sie es von der Quelle erhalten. – zorrinn

0

OK. Nachdem ich viel gearbeitet und gelesen hatte und meinen Kopf gegen die Wand schlug, fand ich das Problem.

REMOTE-Warteschlangen funktionieren sehr anders als lokale private Warteschlangen. Sie können fragen, warum? Nun ... das ist wahrscheinlich ein Mangel an MS-API.

Remote-Warteschlangen sind sehr eklig. Sie unterstützen nicht viele Funktionen, die für normale lokale Warteschlangen verfügbar sind.

Zum Beispiel, in einer fernen Warteschlange, es sei denn, es ist transaktional, können Sie kein BeginPeek tun. Sie können nicht einmal Nachricht.Body überprüfen, weil es einen Fehler werfen würde.

Aber das ist nicht alles. Sie können nicht einmal versehentlich ein Ereignis wie OnPeekCompleted abonnieren (auch wenn Sie kein BeginPeek machen). Das gesamte MessageQueue-Objekt wird verrückt, wenn Sie das tun.

Dieser dumme Grund war der Grund für meine Kopfschmerzen.