2017-06-08 14 views
0

MSMQからメッセージを受信して​​処理するWindowsサービスを作成しています。リスナーにはさまざまなエラー処理手順がありますが、それ以外はすべて失敗しても、メッセージの本文をテキストファイルに保存して見たいと思います。しかし、この条件が当たったときに私のメッセージの内容を抽出することはできません。次のコードは問題のセクションを単純に表したもので、テストしているメッセージが空でないことがわかっていても空のテキストファイルが生成されます。しかし、XMLを逆直列化しようとする最初の試みをコメントアウトすると、フェールセーフが機能し、メッセージ本文のテキストファイルが生成されます。だから私は、問題はデシリアライゼーションの試みが元のストリームをどのように残すかと関係していると思いますか?メッセージに、デシリアライズできる有効なXMLが含まれている場合、サービスはすべて正常に動作し、フェイルセーフは決して動作しません。MSMQメッセージボックスをテキストファイルに保存します。

を窓バイナリメッセージの場合:使用しているフォーマッタによって

 MyClass myClass = null; 

     try 
     { 
      XmlSerializer serializer = new XmlSerializer(typeof(MyClass)); 

      // Comment the following out and the fail safe works 
      // Let this run and fail and the text file below is always empty 
      myClass = (MyClass)serializer.Deserialize(m.BodyStream); 
     } 
     catch (Exception ex) 
     { 

     } 

     if (myClass == null) 
     { 
      string filePath = @"D:\path\file.txt"; 

      m.Formatter = new ActiveXMessageFormatter(); 

      StreamReader reader = new StreamReader(m.BodyStream); 

      File.WriteAllText(filePath, reader.ReadToEnd()); 
     } 
+0

私はSystem.Net.WebUtility.HtmlDecodeとSystem.Net.WebUtility.HtmlEncodeを使用する必要があると思います。 Htmlは特定の特殊文字以外はありません:https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references – jdweng

+0

あなたの返信ありがとうございますが、これはウェブページではありませんので、HTMLはここでは関係ありませんか? XMLはHTMLのようなマークアップ言語ですが、特殊文字は本当にテキストファイルに書き込まれるのをやめますか? – user470249

+0

あなたのサービスはhtmlではないと確信していますか? 「messageBody」は通常、htmlの電子メールメッセージです。 – jdweng

答えて

0

XMLメッセージの

File.WriteAllText(<path>, (new UTF8Encoding()).GetString((byte[])msg.Body)); // for binary 

はこれを試してください:バイナリまたはXMLどちらの場合

msg.Formatter = new XmlMessageFormatter(new String[] { "System.String, mscorlib" }); 
var text = msg.Body.ToString(); 
// write to file.. 

、ネイティブフォーマッタを使用してください:

msg.Formatter = new ActiveXMessageFormatter(); 
reader = new StreamReader(msg.BodyStream); 
msgBody = reader.ReadToEnd(); 
// write to file.. 
+0

Tom:上記の私の最後の回答を参照してください。 – jdweng

+0

@jdweng - クール!これはHTTPメッセージであることをどうお知りになりますか? –

+0

ありがとう!私はそれを試みましたが、次の例外があります。 System.InvalidOperationException:引数として渡されたメッセージを逆シリアル化できません。シリアル化形式を認識できません。 at System.Messaging.BinaryMessageFormatter.Read(メッセージメッセージ) at System.Messaging.Message.get_Body() – user470249

関連する問題