Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Azure:如何从Microsoft.Azure.ServiceBus.Message中读取正文?_C#_Azure_Serialization_Message Bus - Fatal编程技术网

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

C#Azure:如何从Microsoft.Azure.ServiceBus.Message中读取正文?,c#,azure,serialization,message-bus,C#,Azure,Serialization,Message Bus,我在Microsoft.Azure.ServiceBus.Message类中遇到问题。我想创建一个包含有效负载对象的消息对象,然后从中读回这个对象。在我当前的示例中,我甚至没有通过真正的Azure总线发送消息;我只是在内存中创建它,然后尝试阅读它 我不知道我应该把消息正文读成什么类型。我尝试了byte[],string和原始对象类型。在所有情况下,我都会得到一个xmleexception:“输入源的格式不正确” 有人能告诉我在编码或解码信息时我做错了什么吗 [DataContract]

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

我不知道我应该把消息正文读成什么类型。我尝试了
byte[]
string
和原始对象类型。在所有情况下,我都会得到一个
xmleexception
:“输入源的格式不正确”

有人能告诉我在编码或解码信息时我做错了什么吗

    [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]
公共类的东西
{
[数据成员]
公共字符串Doodad{get;set;}
}
私有静态消息CreateMessage()
{
var entityMessage=newthingy{Doodad=“foobar”};
var serializedMessageBody=JsonConvert.SerializeObject(entityMessage);
var contentType=typeof(Thingy).AssemblyQualifiedName;
var bytes=Encoding.UTF8.GetBytes(serializedMessageBody);
var message=新消息(字节){ContentType=ContentType};
返回消息;
}
[测试]
public void ReadMessageBytes()
{
var message=CreateMessage();
var body=message.GetBody();
控制台。写入线(主体);
}
[测试]
public void ReadMessageString()
{
var message=CreateMessage();
var body=message.GetBody();
控制台。写入线(主体);
}
[测试]
public void ReadMessageThingy()
{
var message=CreateMessage();
var body=message.GetBody();
控制台。写入线(主体);
}

使用自定义
DataContract
类型并使用
DataContract序列化程序创建代理消息时:

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)));
Record r = receiveMessage.GetBody<Record>();
您可以通过以下方式接收此消息:

Record r = receiveMessage.GetBody<Record>(new DataContractSerializer(typeof(Record)));
Record r = receiveMessage.GetBody<Record>();
Record r=receiveMessage.GetBody();
如需更多参考,您可以查看。它有针对不同场景的详细示例


希望能有所帮助。

我发现这是可行的:

    [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);
    }
[测试]
public void readmessageproperty()
{
var message=CreateMessage();
var body=message.body;
var text=Encoding.UTF8.GetString(正文);
var thingy=JsonConvert.DeserializeObject(文本);
断言(事物);
断言.AreEqual(“foobar”,thingy.Doodad);
}

您的答案使用
Microsoft.ServiceBus.Messaging.BrokeredMessage
而不是
Microsoft.Azure.ServiceBus.Message
。据我所知,我需要
Message
,因为我依赖于
QueueClient.RegisterMessageHandler
,它使用
Message
,而不是
BrokeredMessage
。您的建议与我的测试方法
ReadMessageThingy
,但失败了。此外,您的设置完全不同,因为
BrokeredMessage
的界面与
Message
的界面不同。