2017-03-20 4 views
1
lesen

Ich habe einen WCF-Client verwendet, um MMSQ-Nachricht an WCF-Dienst zu senden, bevor WCF-Dienst die MMSQ-Nachricht verarbeitet, möchte ich den Nachrichtentext überprüfen.
Nachdem ich den Inhalt des msmq Nachrichtentextes überprüft habe, habe ich unten das Ergebnis erhalten.
enter image description here
Aber ich habe nicht die genaue Zeichenfolge erhalten.
Im Folgenden finden Sie Definition von WCF-DienstWCF-MSMQ-Nachricht von C#

[ServiceContract] 
public interface IMSMQService 
{ 

    [OperationContract(IsOneWay = true)]  

    void ShowMessage(string msg); 
} 

I unten Methode Nachrichtentext abzurufen, und es Ausgabe leer, wenn ich Uhr auf ms hinzufügen, konnte ich

„\ 0 \ U0001 erhalten \ 0 \ u0001 \ u0004 \ u0002 (net.msmq: // vdi-v-tazho/privat/TestQueue \ u0003 \ aV \ u0002 \ v \ u0001s \ u0004 \ v \ u0001a \ u0006V \ bD \ n \ u001e \ 0 + http://tempuri.org/IMSMQService/[email protected] \ u0017VsDebuggerCausalityData \ bAhttp: //schemas.microsoft.com/vstudio/diagnostics/servicemodelsink < ϣ-lN FoJ 0 u \ u0006 \ "\ 0 \ 0 \ 0 \ 0 \ u0017 \ 0i8 C I \ 7^Q A \ u0012 w} \ f A \ u000f \ r ޮ pe \ 0 \ t \ 0 \ 0D \ f \ u00e0e \ 0 (net.msmq: // vdi-v-tazho/privat/TestQueue \ u0001V \ u000e @ \ vShowMessage \ b \ u0013http: //tempuri.org/@ \ u0003msg \ \ u0004test \ U0001 \ U0001 \ U0001"

   //message.Formatter = new XmlMessageFormatter(new String[] { }); 
      //StreamReader sr = new StreamReader(message.BodyStream); 
      string ms = ""; 
      //while (sr.Peek() >= 0) 
      //{ 
      // ms += sr.ReadLine(); 
      //} 
      message.Formatter = new ActiveXMessageFormatter(); 
      string result = System.Text.Encoding.UTF8.GetString(message.Body as byte[]); 
      StreamReader reader = new StreamReader(message.BodyStream); 

      ms = reader.ReadToEnd(); 
      MessageBox.Show(ms); 

Antwort

1

ich unten Code habe meine Anforderung zu erreichen.

private void MSMQStringBody_Click(object sender, EventArgs e) 
{ 
    System.Messaging.MessageQueue[] queueList = System.Messaging.MessageQueue.GetPrivateQueuesByMachine(Environment.MachineName); 
    MessageQueue myQueue = queueList[1]; 
    List<System.Messaging.Message> messages = myQueue.GetAllMessages().ToList(); 
    foreach (System.Messaging.Message message in messages) 
    { 
     System.Xml.XmlDocument result = ConvertToXMLDoc(message); 
     MessageBox.Show(result.InnerText); 
    } 

} 
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; 
} 
0

Wenn Sie einen Nachrichtentext in/aus MSMQ senden/abrufen, sollten Sie den gleichen "Typ" verwenden. Siehe generischen Typ "T" unten. T könnte eine beliebige benutzerdefinierte Klasse sein.

public T GetQueueMessage() 
    { 
     Message message = queue.Receive(new TimeSpan(0, 0, 0, 1, 0)); 
     return (T)message.Body; 
    } 

    public void InsertQueueMessage(T message) 
    { 
     using (Message msg = new Message((object)message)) 
     { 
      queue.Send(msg, MessageQueueTransactionType.Single); 
     } 
    }