4

C# WPF アプリケーションでメッセージ キューから XML メッセージを読みたいと思っています。メッセージは、Navision コードユニットによってキューに保存されます。まず、キューに保存されたメッセージが使用できるかどうかはよくわかりません。これは、次のような 16 進形式であるためです。

FF FE 3C 00 3F 00 78 00 ÿþ<.?.x.
6D 00 6C 00 20 00 76 00 m.l. .v.
65 00 72 00 73 00 69 00 e.r.s.i.
6F 00 6E 00 3D 00 22 00 o.n.=.".
31 00 2E 00 30 00 22 00 1...0.".
20 00 65 00 6E 00 63 00  .e.n.c.
6F 00 64 00 69 00 6E 00 o.d.i.n.
67 00 3D 00 22 00 55 00 g.=.".U.
54 00 46 00 2D 00 31 00 T.F.-.1.
36 00 22 00 20 00 73 00 6.". .s.
74 00 61 00 6E 00 64 00 t.a.n.d.
61 00 6C 00 6F 00 6E 00 a.l.o.n.
...

キューからのメッセージの受信は既に機能していますが、このランタイム例外「無効な操作の例外: 引数として渡されたメッセージを逆シリアル化できません。シリアル化形式を認識できません。」が発生するため、何らかの形式が間違っています。

私はメッセージを読むためにこのコードを使用しています:

public MainWindow()
{
    InitializeComponent();
    mqCustomerData = new MessageQueue(@".\private$\customerData");
    mqCustomerData.Formatter = new XmlMessageFormatter(new Type[] { typeof(String) });
    mqCustomerData.ReceiveCompleted += new ReceiveCompletedEventHandler(mqCustomerData_ReceiveCompleted);
    mqCustomerData.BeginReceive(new System.TimeSpan(0, 0, 0, 30));
}

private void mqCustomerData_ReceiveCompleted(object sender, System.Messaging.ReceiveCompletedEventArgs e)
{
    Message m = new Message();
    m.Formatter = new XmlMessageFormatter(new Type[] { typeof(String) });
    m = mqCustomerData.EndReceive(e.AsyncResult);
    string text = (string)m.Body;
}

問題を検索しましたが、有用な解決策は見つかりませんでした。次のような同じ問題を経験している他のユーザーの投稿のみが見つかりました: http://www.webmasterworld.com/microsoft_asp_net/4119362.htm

誰かがこれで私を助けてくれることを願っています:)

4

2 に答える 2

2

有能な_技術の答えでは、過負荷はありません

Encoding.Unicode.GetString(m.Body);

文字列引数を取ります。

これが使用したいアプローチである場合は、文字列をバイト配列に変換する必要があります -

byte[] arr;
    using(MemoryStream ms = new MemoryStream())
                    {
                        m.BodyStream.Position = 0;
                        m.BodyStream.CopyTo(ms);
                        arr =  ms.ToArray();
                    }



     string s = Encoding.Unicode.GetString(arr, 0, arr.Length);  
于 2017-04-27T19:49:22.753 に答える
1

データが FF FE で始まるため、リトルエンディアン UTF-16 のように見えます。

次のようなものを使用して文字列をデコードする必要があります。

string text = Encoding.Unicode.GetString(m.Body);
于 2011-11-24T20:36:04.547 に答える