Azure服务总线中BrokeredMessage体的编码 [英] Encoding of BrokeredMessage Body in Azure Service Bus

查看:161
本文介绍了Azure服务总线中BrokeredMessage体的编码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  public virtual void SendMessage(object bodyObject)
{
var brokeredMessage =
_messageBodySerializer.SerializeMessageBody(bodyObject);

_queueClient.Send(brokeredMessage);
}

使用 SerializeMessageBody 由...组成:

  public BrokeredMessage SerializeMessageBody(object bodyObject)
{
var brokeredMessage = new BrokeredMessage );

brokeredMessage.Properties [MESSAGE_TYPE_PROPERTY_KEY] =
bodyObject.GetType()。AssemblyQualifiedName;

return brokeredMessage;
}

我已经编写了一个集成测试,通过运行 SendMessage 然后使用 Service Bus Explorer 2.0 。我们正在这样做,以确保我们可以使用该工具修复和重新发送消息来修改XML。我发送的消息如下所示:

  [DataContract] 
public class TestServiceBusMessage
{
[DataMember]
public Guid ExternalIdentifier {get;组; }

[DataMember]
public int标识符{get;组;

[DataMember]
public string Name {get;组;
}

问题是:当消息体在工具上查看时,而不是看起来像XML,而是如下所示:

  @TestServiceBusMessageWhttp:/ //www.sc3.org b $ b标识符?& @名称?测试消息

我假设这是一个编码问题;然而,当将身体传递到 BrokeredMessage 构造函数中时,我看不到设置编码的方法;或者通过 DataContract 属性定义它。



我如何解决这个编码问题?我需要提供自己的 serializer / stream 还是有办法强制默认序列化程序正确编码? p>

解决方案

请尝试以下代码。我测试了它,我可以使用我的工具看到XML格式的有效载荷(Service Bus Explorer: http://code.msdn.microsoft.com/windowsazure/Service-Bus-Explorer-f2abca5a#content )。
基本上,您需要在BrokeredMessage对象的构造函数中显式指定DataContractSerializer。希望这可以帮助。
Ciao
Paolo

  #region MyRegion 
using System;
使用System.Runtime.Serialization;
使用Microsoft.ServiceBus;
使用Microsoft.ServiceBus.Messaging;
#endregion

命名空间StackOverflow
{
静态类程序
{
#region私有常量
private const string QueueName = 堆栈溢出;
private const string MessageType =MessageType;
private const string AssemblyName =AssemblyName;
private const string ConnectionString =< your-service-bus-namespace-connectionstring>;
#endregion

#region静态方法
static void Main()
{
SendMessage();
}

static async void SendMessage()
{
try
{
//创建NamespaceManager对象
var namespaceManager = NamespaceManager.CreateFromConnectionString(ConnectionString中);
Console.WriteLine(NamespaceManager successfully created。);

//创建测试队列
if(!namespaceManager.QueueExists(QueueName))
{
namespaceManager.CreateQueue(new QueueDescription(QueueName)
{
RequiresDuplicateDetection = false,
RequiresSession = false,
LockDuration = TimeSpan.FromSeconds(60)
});
Console.WriteLine(队列成功创建);
}

//创建MessagingFactory对象
var messagingFactory = MessagingFactory.CreateFromConnectionString(ConnectionString);
Console.WriteLine(MessagingFactory successfully created。);

//创建MessageSender对象
var messageSender = await messagingFactory.CreateMessageSenderAsync(QueueName);
Console.WriteLine(MessageSender successfully created。);

//创建消息有效负载
var testServiceBusMessage = new TestServiceBusMessage
{
ExternalIdentifier = Guid.NewGuid(),
标识符= 1,
Name =Babo
};

//创建BrokeredMessage对象
使用(var brokeredMessage = new BrokeredMessage(testServiceBusMessage,
new DataContractSerializer(typeof(TestServiceBusMessage)))
{
属性= {{MessageType,typeof(TestServiceBusMessage).FullName},
{AssemblyName,typeof(TestServiceBusMessage).AssemblyQualifiedName}}
})
{
//发送消息
messageSender.SendAsync(brokeredMessage).Wait();
}
Console.WriteLine(Message successfully sent。);
Console.WriteLine(按[Enter]退出);
Console.ReadLine();
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine(按[Enter]退出);
Console.ReadLine();
}
}
#endregion
}

[DataContract]
public class TestServiceBusMessage
{
[DataMember ]
public Guid ExternalIdentifier {get;组; }

[DataMember]
public int标识符{get;组;

[DataMember]
public string Name {get;组; }
}
}


We have the below wrapper around the Azure Service Bus Client:

public virtual void SendMessage(object bodyObject)
{
    var brokeredMessage = 
        _messageBodySerializer.SerializeMessageBody(bodyObject);

    _queueClient.Send(brokeredMessage);
}

With the SerializeMessageBody consisting of:

public BrokeredMessage SerializeMessageBody(object bodyObject)
{
    var brokeredMessage = new BrokeredMessage(bodyObject);

    brokeredMessage.Properties[MESSAGE_TYPE_PROPERTY_KEY] = 
                    bodyObject.GetType().AssemblyQualifiedName;

    return brokeredMessage;
}

I've written an integration test to check this works by running SendMessage then viewing the message contents using Service Bus Explorer 2.0. We are doing this to ensure we can repair and resend messages using the tool to modify the XML. The message I am sending looks like this:

[DataContract]
public class TestServiceBusMessage
{
    [DataMember]
    public Guid ExternalIdentifier { get; set; }

    [DataMember]
    public int Identifier { get; set; }

    [DataMember]
    public string Name { get; set; }
}

The problem is; when the message body is viewed on the tool, instead of looking like XML it instead comes out like below:

@TestServiceBusMessageWhttp://schemas.datacontract.org/2004/07/IntegrationTests.Common.Azure.ServiceBus   i)http://www.w3.org/2001/XMLSchema-instance@ExternalIdentifier?$13d81b90-d932-437f-a11c-9106412b6c4a@
Identifier?&    @Name?Test Message   

I assume this is an encoding issue; however I cannot see a way to set the encoding when passing the body into the BrokeredMessage constructor; or defining it through a DataContract attribute.

How would I get around this encoding issue? Would I need to provide my own serializer / stream or is there a way to force the default serializer to encode correctly?

解决方案

try the following code. I tested it and I can see the payload in XML format using my tool (Service Bus Explorer: http://code.msdn.microsoft.com/windowsazure/Service-Bus-Explorer-f2abca5a#content). Basically, you need to explicitly specify the DataContractSerializer in the constructor of the BrokeredMessage object. Hope this helps. Ciao Paolo

#region MyRegion
using System;
using System.Runtime.Serialization;
using Microsoft.ServiceBus;
using Microsoft.ServiceBus.Messaging; 
#endregion

namespace StackOverflow
{
    static class Program
    {
        #region Private Constants
        private const string QueueName = "stackoverflow";
        private const string MessageType = "MessageType";
        private const string AssemblyName = "AssemblyName";
        private const string ConnectionString = "<your-service-bus-namespace-connectionstring>"; 
        #endregion

        #region Static Methods
        static void Main()
        {
            SendMessage();
        }

        static async void SendMessage()
        {
            try
            {
                // Create NamespaceManager object
                var namespaceManager = NamespaceManager.CreateFromConnectionString(ConnectionString);
                Console.WriteLine("NamespaceManager successfully created.");

                // Create test queue
                if (!namespaceManager.QueueExists(QueueName))
                {
                    namespaceManager.CreateQueue(new QueueDescription(QueueName)
                    {
                        RequiresDuplicateDetection = false,
                        RequiresSession = false,
                        LockDuration = TimeSpan.FromSeconds(60)
                    });
                    Console.WriteLine("Queue successfully created.");
                }

                // Create MessagingFactory object
                var messagingFactory = MessagingFactory.CreateFromConnectionString(ConnectionString);
                Console.WriteLine("MessagingFactory successfully created.");

                // Create MessageSender object
                var messageSender = await messagingFactory.CreateMessageSenderAsync(QueueName);
                Console.WriteLine("MessageSender successfully created.");

                // Create message payload
                var testServiceBusMessage = new TestServiceBusMessage
                {
                    ExternalIdentifier = Guid.NewGuid(),
                    Identifier = 1,
                    Name = "Babo"
                };

                // Create BrokeredMessage object
                using (var brokeredMessage = new BrokeredMessage(testServiceBusMessage,
                                                                 new DataContractSerializer(typeof(TestServiceBusMessage)))
                {
                    Properties = {{MessageType, typeof(TestServiceBusMessage).FullName},
                                  {AssemblyName, typeof(TestServiceBusMessage).AssemblyQualifiedName}}
                })
                {
                    //Send message
                    messageSender.SendAsync(brokeredMessage).Wait();
                }
                Console.WriteLine("Message successfully sent.");
                Console.WriteLine("Press [Enter] to exit");
                Console.ReadLine();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.WriteLine("Press [Enter] to exit");
                Console.ReadLine();
            }
        } 
        #endregion
    }

    [DataContract]
    public class TestServiceBusMessage
    {
        [DataMember]
        public Guid ExternalIdentifier { get; set; }

        [DataMember]
        public int Identifier { get; set; }

        [DataMember]
        public string Name { get; set; }
    }
}

这篇关于Azure服务总线中BrokeredMessage体的编码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆