簡體   English   中英

C# Azure:如何從 Microsoft.Azure.ServiceBus.Message 讀取正文?

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

我在使用Microsoft.Azure.ServiceBus.Message類時遇到問題。 我想創建一個包含有效負載對象的 Message 對象,然后從中讀取該對象。 在我當前的示例中,我什至沒有通過真正的 Azure 總線發送消息; 我只是在內存中創建它,然后嘗試讀取它。

我無法弄清楚我應該將消息正文讀取為什么類型。 我試過byte[]string和原始對象類型。 在我的所有情況下,我都會收到XmlException :“輸入源的格式不正確”。

有人可以告訴我在編碼或解碼消息時我做錯了什么嗎?

    [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);
    }

我發現這有效:

    [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);
    }

使用自定義DataContract類型和DataContractSerializer創建 BrokeredMessage 時:

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 + Binary 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>();

如需更多參考,您可以查看此博客 它有針對不同場景的詳細示例。

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM