1

LinqToXSDを使用してMSMQを介してデータを送信しています。これが私の送信コードです

public void Send()
        {
            string criMessageQueuePath = ConfigurationManager.AppSettings["CRIMessageQueuePath"];

            if (!MessageQueue.Exists(criMessageQueuePath))
            {
                MessageQueue.Create(criMessageQueuePath, false);
            }

            var messageQueue = new MessageQueue(criMessageQueuePath) { Label = "CRI Message Queue" };
            messageQueue.Formatter = new XmlMessageFormatter(new[] { typeof(XML) });

            var transaction = new MessageQueueTransaction();

            transaction.Begin();

            messageQueue.Send(CreateAuction(1), transaction);
            messageQueue.Send(CreateAuction(2), transaction);
            messageQueue.Send(CreateAuction(3), transaction);
            messageQueue.Send(CreateAuction(4), transaction);
            messageQueue.Send(CreateAuction(5), transaction);

            transaction.Commit();
        }

        private XML CreateAuction(int id)
        {
            var message = new XML {id = id};
            return message;
        }

これが私の受信コードです

public IEnumerable<string> Receive()
        {
            string criMessageQueuePath = ConfigurationManager.AppSettings["CRIMessageQueuePath"];

        var messageQueue = new MessageQueue(criMessageQueuePath);

        Message[] messages = messageQueue.GetAllMessages();

        foreach (Message message in messages)
        {
            message.Formatter = new XmlMessageFormatter(new[] { typeof(XML) });
            yield return message.Body.ToString();
        }

        messageQueue.Purge();
    }

このコードのバリエーションをたくさん試しましたが、反対側から有効なXMLオブジェクトを取得できない理由がわかりません。

現在、コードを呼び出すと失敗します

static void Main()
        {
            var sender = new Sender.Sender();
            sender.Send();

            var receiver = new Receiver.Receiver();
            foreach (var xml in receiver.Receive())
            {
                var typedXML = XML.Parse(xml);
                Console.WriteLine(typedXML.id);
            }
        }

失敗する行はですvar typedXML = XML.Parse(xml);。エラーは

Element is not an instance of type Domain.XML

オブジェクトのXSDは

<?xml version="1.0" encoding="Windows-1252"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="Domain">
  <xs:element name="XML">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="id" type="xs:int" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

xmlライン上のの値を見て

var typedXML = XML.Parse(xml);

これを生成していることがわかります

"<XML>\r\n  <XML xmlns=\"Domain\">\r\n    <id>1</id>\r\n  </XML>\r\n</XML>"

つまり、xml全体の周りに追加のxmlノードを生成します。デバッガーでこの余分なノードを削除すると、すべて機能します。私は何が間違っているのですか?

4

1 に答える 1

1

これは、オブジェクトをシリアル化し、XML でラップするときに XmlMessageFormatter を使用した結果です。代わりに、XML ドキュメントを直接 BodyStream プロパティに書き込むことをお勧めします。

var msg = new Message();
var writer = new StreamWriter(msg.BodyStream);

writer.Write(xmlDoc.ToString());
writer.Flush();

queue.Send(msg);

このようにして、キューで送信されるものを完全に制御できます。フォーマッタは主に従来の使用のためにあり、XML ドキュメントをメッセージとして送信する場合には使用しないでください。

于 2013-02-20T08:29:42.447 に答える