2016-06-17 19 views
0

私のMSMQがリモートマシン上にあります。 次のように私のコードは、あるMSMQ OnReceiveCompletedメソッド - Queue.BodyがInvaliOperationExceptionをスローする

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(); 
    } 

は、私は、Windowsのサービスとして、これを実行しているよ、わからないことは違います。しかし、msg.BodyはInvaliOperationExceptionをスローします。

実際には、msgのプロパティのほとんどが例外をスローしています。何か案が?あなたがメッセージキュー

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

。だから多くの仕事と読書、壁に頭を打つと、私は問題が何かを発見しました。

REMOTEキューは、ローカルのプライベートキューとは大きく異なります。 あなたは質問するかもしれません、なぜですか?これはおそらくMSのAPIの欠点です。

リモートキューは非常に厄介です。通常のローカルキューで利用できる多くの機能をサポートしていません。

たとえば、トランザクションでない限りリモートキューでは、BeginPeekを実行できません。あなたはエラーを投げるので、message.Bodyをチェックすることさえできません。

しかし、それだけではありません。たとえあなたがBeginPeekをやっていないとしても、OnPeekCompletedのようなイベントに誤って購読することはできません。これを行うと、MessageQueueオブジェクト全体が狂ってしまいます。

この愚かな理由が私の頭痛の原因でした。

+0

動作しませんでした。唯一の違いは、あなたがソースから取得しているのに対し、私の_queueはクラスメンバーです。 – zorrinn

関連する問題