C# Azure:如何从 Microsoft.Azure.ServiceBus.Message 读取正文?

C# Azure: How to read body from Microsoft.Azure.ServiceBus.Message?

我在使用 Microsoft.Azure.ServiceBus.Message class 时遇到了问题。我想创建一个包含有效负载对象的 Message 对象,然后从中读取该对象。在我当前的示例中,我什至没有通过真正的 Azure 总线发送消息;我只是在内存中创建它,然后尝试读取它。

我不知道应该将邮件正文阅读为哪种类型。我试过 byte[]string 和原始对象类型。在我所有的情况下,我得到一个 XmlException: "The input source is not correctly formatted".

谁能告诉我在编码或解码消息时我做错了什么?

    [DataContract]
    public class Thingy
    {
        [DataMember]
        public string Doodad { get; set; }
    }

    private static Message CreateMessage()
    {
        var entityMessage = new Thingy {Doodad = "foobar"};
        var serializedMessageBody = JsonConvert.SerializeObject(entityMessage);
        var contentType = typeof(Thingy).AssemblyQualifiedName;
        var bytes = Encoding.UTF8.GetBytes(serializedMessageBody);
        var message = new Message(bytes) {ContentType = contentType};
        return message;
    }

    [Test]
    public void ReadMessageBytes()
    {
        var message = CreateMessage();
        var body = message.GetBody<byte[]>();
        Console.WriteLine(body);
    }

    [Test]
    public void ReadMessageString()
    {
        var message = CreateMessage();
        var body = message.GetBody<string>();
        Console.WriteLine(body);
    }

    [Test]
    public void ReadMessageThingy()
    {
        var message = CreateMessage();
        var body = message.GetBody<Thingy>();
        Console.WriteLine(body);
    }

使用自定义 DataContract 类型创建 BrokeredMessage 并使用 DataContractSerializer 时:

Record recordDataContract = new Record { Id = "DataContract Record" };

BrokeredMessage recordDataContractMessage = new BrokeredMessage(recordDataContract, new DataContractSerializer(typeof(Record)));

您可以通过以下方式收到此消息:

Record r = receiveMessage.GetBody<Record>(new DataContractSerializer(typeof(Record)));

使用自定义 **DataContract** 类型和默认序列化程序(DataContract + 二进制 Xml 创建 **BrokeredMessage** 时:

[DataContract(Namespace = "")]

class Record {

[DataMember]

public string Id { get; set; }

}


Record recordDefault = new Record { Id = "default Record" };

BrokeredMessage recordDefaultMessage = new BrokeredMessage(recordDefault);

您可以通过以下方式收到此消息:

Record r = receiveMessage.GetBody<Record>();

如需更多参考,您可以查看 this blog。它有针对不同场景的详细示例。

希望对您有所帮助。

我发现这行得通:

    [Test]
    public void ReadMessageProperly()
    {
        var message = CreateMessage();
        var body = message.Body;
        var text = Encoding.UTF8.GetString(body);
        var thingy = JsonConvert.DeserializeObject<Thingy>(text);
        Assert.IsInstanceOf<Thingy>(thingy);
        Assert.AreEqual("foobar", thingy.Doodad);
    }