2016-06-17 4 views
0

내 MSMQ가 원격 컴퓨터에 있습니다. 다음과 같이 내 코드입니다MSMQ OnReceiveCompleted 메서드 - Queue.Body가 InvaliOperationException을 throw합니다.

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 속성의 대부분이 예외를 던지고 있습니다. 어떤 생각? here is a screen shot

답변

0

왜 MessageQueue가

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

작동하지 않았습니다. 유일한 차이점은 내 _queue가 클래스 멤버 인 반면 소스에서 가져 오는 것입니다. – zorrinn

0

OK source 매개 변수를 캐스팅하지 마십시오. 그래서 많은 일과 독서를하고, 벽에 머리를 두드린 후, 나는 그 문제가 무엇인지 발견했습니다.

REMOTE 대기열은 로컬 개인용 대기열과 매우 다른 방식으로 작동합니다. 왜 물을 수 있습니까? 글쎄 ... 아마도 MS API의 결함 일 것입니다.

원격 대기열은 매우 까다 롭습니다. 일반 로컬 대기열에 사용할 수있는 많은 기능을 지원하지 않습니다.

예를 들어 트랜잭션이 아닌 경우 원격 대기열에서 BeginPeek을 수행 할 수 없습니다. 메시지를 확인조차 할 수 없습니다 .Body. 오류가 발생합니다.

하지만 그게 전부는 아닙니다. OnPeekCompleted와 같은 이벤트에 실수로 가입 할 수도 없습니다 (BeginPeek를하지 않은 경우에도). 그렇게하면 전체 MessageQueue 객체가 열중하게됩니다.

이 바보 같은 이유가 내 두통의 원인이었습니다.