C# Azure: Как прочитать тело от Microsoft. Azure .ServiceBus.Message? - PullRequest
0 голосов
/ 07 января 2020

У меня проблемы с классом 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);
    }

Ответы [ 2 ]

1 голос
/ 07 января 2020

Я узнал, что это работает:

    [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);
    }
0 голосов
/ 07 января 2020

При создании BrokeredMessage с использованием пользовательского типа DataContract и использованием 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)));

При создании **BrokeredMessage** используя пользовательский тип **DataContract** и используя сериализатор по умолчанию (DataContract + Binary Xml):

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

Для дополнительной справки вы можете проверьте этот блог . В нем есть подробный пример для различных сценариев ios.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...