2017-03-20 13 views
1

WCFサービスがmsmqメッセージを処理する前に、WCFクライアントからWCFサービスを使用してメッセージを送信しました。
msmqメッセージ本文の内容を確認した結果、以下の結果が得られました。
enter image description here
しかし、正確な文字列を取得できませんでした。以下
は、私がメッセージ本文を取得するための方法の下に使用し、それを出力空WCFサービスの定義C#からWCF MSMQメッセージを読み取る

[ServiceContract] 
public interface IMSMQService 
{ 

    [OperationContract(IsOneWay = true)]  

    void ShowMessage(string msg); 
} 

である私は、MSに時計を追加した場合、私は「\ 0 \ U0001を

を得ることができます\ 0 \ u0001 \ u0004 \ u0002(net.msmq://vdi-v-tazho/private/TestQueue \ u0003 \ a0002 \ 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 \あなたは\\ 0 \\ 8 \\ 7 \ 8 \ Q \ 8 \ 0 \ 0D \ f \ u001e \0 (net.msmq://vdi-v-tazho/private/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); 

答えて

1

私は私の要件を達成するために、コードの下になりました。

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

MSMQにメッセージ本文を送信/取得するときは、同じ「タイプ」を使用する必要があります。以下のジェネリックタイプ「T」を参照してください。 Tはカスタムクラスのいずれかになります。

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); 
     } 
    } 
関連する問題