2017-02-22 4 views
1

MSMQ에서 메시지를 가져올 때 어떤 결과를 얻었습니다. 메시지가 손상된 것처럼 보입니다. 객체에 다시 구문 분석하려고하면 xml 예외가 생깁니다.MSMQ 메시지를 개체로 구문 분석 할 수 없습니다.

여기 내가하려는 일이 있습니다.

내가 사용하고 영수증 객체가

MessageQueue queue = new MessageQueue(ConfigurationManager.AppSettings["receiptQueue"]); 
      { 
       queue.Formatter = new XmlMessageFormatter(new[] { typeof(Receipt) }); 
       Message msg = new Message(); 
       Receipt obj = new Receipt(); 
       obj.AlertId = alertId; 
       obj.UserName = userName; 
       obj.Version = version; 
       obj.PC = pcName; 
       msg.Body = obj; 
       queue.Send(msg); 
      } 

내가 노력하고있어 Windows 서비스에서이

public class Receipt 
{ 
    public Receipt() 
    { 
    } 
    public int AlertId { get; set; } 
    public int Version { get; set; } 
    public string UserName { get; set; } 
    public string PC { get; set; } 
} 

과 같은 코드를 사용하여 웹 서비스에서 MSMQ에 쓰고 있어요 대기열에서 객체를 가져옵니다.

초기화 큐

MessageQueue receiptQueue = new MessageQueue(ConfigurationManager.AppSettings["receiptQueue"]); 
     receiptQueue.Formatter = new XmlMessageFormatter(new[] { typeof(Receipt) }); 
     receiptQueue.ReceiveCompleted += new ReceiveCompletedEventHandler(ReceiptReceiver); 
     receiptQueue.BeginReceive(); 

메시지

private void ReceiptReceiver(object source, ReceiveCompletedEventArgs asyncResult) 
    { 
     Receipt receptObj = new Receipt(); 
     MessageQueue mq = (MessageQueue)source; 
     Message mes =mq.EndReceive(asyncResult.AsyncResult);   
     try 
     {  
      receptObj = (Receipt)mes.Body; //error happens here 
      //Do logic 
     } 
     } 
     catch (Exception ex) 
     { 
      // ex handeling 
     } 
     mq.BeginReceive(); 
    } 

내가 mq.EndReceive 후 메시지에 대한 다음과 같은 정보가

Message object

그런 다음 위치를 잡아 간다받을

를 처리 예외는 "Root element is missing"입니다.

이것은 대기열의 메시지입니다. 모양이 꽤 잘 보인다.

<?xml version="1.0"?> 
<Receipt xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <AlertId>500</AlertId> 
    <Version>2</Version> 
    <UserName>jk9c</UserName> 
    <PC>aasudv211</PC> 
</Receipt> 

내가 잘못하고있는 것에 대한 제안 사항이 있으십니까?

/비르

+0

MSMQ의 메시지는 무엇입니까? 손에 마사지를 받았다면 MSMQ의 직렬화 또는 비 직렬화가 잘못되었는지 알 수 없습니다. – klashar

+0

대기열에서 메시지를 추가했습니다. 서식이 잘 보입니다. – Birger

답변

1

그것은 매우 간단하고 매우 어리석은 실수 .. 오류를 발견. 코드에서 다른 위치의 잘못된 포맷터에 대기열을 할당했습니다. 나는 모든 것이 잘 작동하고 마지막을 제거 후

그래서

receiptQueue.Formatter = new XmlMessageFormatter(new[] { typeof(Receipt) }); 

receiptQueue.Formatter = new XmlMessageFormatter(new[] { typeof(AlertMessage) }); 

했다.