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);
}
我在使用 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);
}