2010-06-02 11 views
7

Chcę zajrzeć do moich kolejek, przystawka konsoli msm ma to okno dialogowe właściwości, ale jest bardzo trudna do odczytania, a ważne dla mnie wiadomości są kodowane i wyglądać tak:Jak czytać wiadomości msmq (ja, nie komputer)

3C 3F 78 6D 6C 20 76 65 <?xml ve 
72 73 69 6F 6E 3D 22 31 rsion="1 
2E 30 22 20 65 6E 63 6F .0" enco 
64 69 6E 67 3D 22 75 74 ding="ut 
66 2D 38 22 3F 3E 0D 0A f-8"?>.. 
3C 65 73 62 3A 6D 65 73 <esb:mes 
73 61 67 65 73 20 78 6D sages xm 
6C 6E 73 3A 65 73 62 3D lns:esb= 
22 68 74 74 70 3A 2F 2F "http:// 
73 65 72 76 69 63 65 62 serviceb 
75 73 2E 68 69 62 65 72 us.hiber 
6E 61 74 69 6E 67 72 68 natingrh 

...

Każdy zna narzędzia, które pozwoliłoby mi zobaczyć moje wiadomości w przyjaznej nieco dewelopera sposób? Narzędzie do łatwiejszych kolejek administrujących przyjdzie przydatny do (jak wybierając kilka wiadomości i przeciągnij i upuść)

Odpowiedz

5

Chodzi o najlepsze narzędzie jakie znaleziono: http://www.cogin.com/msmq/QueueExplorer/QueueExplorer2.2.php

+0

Hm, wygląda ładnie - ale widzę tylko moją kolejkę sub Journal - myślisz, że to dlatego, że nie jestem zarejestrowanym użytkownikiem? – Jan

+0

Nie mam wersji próbnej, ale w mojej pełnej wersji mogę eksplorować wszystkie kolejki, w tym zdalne kolejki. –

+0

mają teraz nową wersję beta, która obsługuje podsieci. Używam tego do tej pory. Trochę buggy (no, beta), ale całkiem przydatne narzędzie. Zastanawiam się, dlaczego stwardnienie rozsiane nie może wymyślić czegoś lepszego. – Jan

0

Jeśli tylko masz jakieś dane, które mogą szesnastkowy łatwo przekonwertować na ASCII iz powrotem, a następnie proponuję edytor tekstu, który pozwoli ci to zrobić. UltraEdit ma funkcję "widoku szesnastkowego", która służy do konwertowania zarówno z widoku szesnastkowego, jak iz niego. Możesz także wypróbować Notepad ++, ale nie wiem, czy ma tę funkcję.

+1

Okno dialogowe właściwości pokazuje tylko pierwsze n wierszy i tekst odkodowany poza tym. Wątpię, czy mógłbym z tym cokolwiek zrobić. – Jan

+0

Och, nie zdawałem sobie sprawy, że nie masz dostępu do większej ilości danych. – JYelton

2

Spróbuj tego:

string QueueName = @".\private$\publishingQueue"; 

//note, you cannot use method exists on remote queues 

if (MessageQueue.Exists(QueueName)) 
{ 
    var queue = new MessageQueue(queueInfo.QueueName) 
    { 
     MessageReadPropertyFilter = new MessagePropertyFilter 
     { 
      ArrivedTime = true, 
      Body = true 
     } 
    }; 

    var messages = queue.GetAllMessages(); 
    var m = messages[0]; 
    m.Formatter = new System.Messaging.XmlMessageFormatter(new String[] {}); 

    StreamReader sr = new StreamReader(m.BodyStream); 

    string ms = ""; 
    string line; 

    while (sr.Peek() >= 0) 
    { 
     ms += sr.ReadLine(); 
    } 

    //ms now contains the message  
} 
2

znalazłem tych dwóch metod w poszukiwaniu odpowiedzi na to pytanie i rzeczywiście działało idealnie.

public System.Xml.XmlDocument ConvertToXMLDoc(System.Messaging.Message msg) 
    { 
     byte[] buffer = new byte[msg.BodyStream.Length]; 
     msg.BodyStream.Read(buffer, 0, (int)msg.BodyStream.Length); 
     int envelopeStart = FindEnvolopeStart(buffer); 
     System.IO.MemoryStream stream = new System.IO.MemoryStream(buffer, envelopeStart, buffer.Length - envelopeStart); 
     System.ServiceModel.Channels.BinaryMessageEncodingBindingElement elm = new System.ServiceModel.Channels.BinaryMessageEncodingBindingElement(); 
     System.ServiceModel.Channels.Message msg1 = elm.CreateMessageEncoderFactory().Encoder.ReadMessage(stream, Int32.MaxValue); 
     System.Xml.XmlDocument doc = new System.Xml.XmlDocument(); 
     doc.Load(msg1.GetReaderAtBodyContents()); 
     msg.BodyStream.Position = 0; 
     return doc; 
    } 

    private int FindEnvolopeStart(byte[] stream) 
    { 
     int i = 0; 
     byte prevByte = stream[i]; 
     byte curByte = (byte)0; 
     for (i = 0; i < stream.Length; i++)    
     { 
      curByte = stream[i]; 
      if (curByte == (byte)0x02 && 
      prevByte == (byte)0x56) 
       break; 
      prevByte = curByte; 
     } 
     return i - 1; 
    } 

Wystarczy wywołać funkcję ConvertToXmlDoc, zapewniając komunikat z kolejki komunikatów, a dostaniesz XmlDocument powrotem. Jestem leniwy, więc po prostu upuszczam innerXml do pliku, abym mógł go przeczytać.

MessageQueue queue = new MessageQueue(queueName); 
    var msg = queue.Receive(); 
    var doc = ConvertToXMLDoc(msg);     
    using (var sw = new StreamWriter(@"C:\message.txt"))) 
      sw.Write(doc.InnerXml); 

Brak aplikacji do kupienia i odzyskasz dane w kodzie, dzięki czemu możesz sobie z tym poradzić.

PS: Kredyt, na który należy się kredyt. Fragment pochodzi z http://social.msdn.microsoft.com/forums/en-US/wcf/thread/c03d80cd-492c-4ece-8890-6a35b12352e0, który zawiera również bardziej szczegółowe omówienie formatu kodowania MSMQ.

Powiązane problemy