在Azure的服务总线BrokeredMessage机构编码 [英] Encoding of BrokeredMessage Body in Azure Service Bus

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

问题描述

我们有大约在Azure服务总线客户端以下包装:

 公共虚拟无效的SendMessage(对象bodyObject)
{
    VAR brokeredMessage =
        _messageBodySerializer.SerializeMessageBody(bodyObject);    _queueClient.Send(brokeredMessage);
}

随着 SerializeMessageBody 包括:

 公共BrokeredMessage SerializeMessageBody(对象bodyObject)
{
    VAR brokeredMessage =新BrokeredMessage(bodyObject);    brokeredMessage.Properties [MESSAGE_TYPE_PROPERTY_KEY] =
                    bodyObject.GetType()AssemblyQualifiedName。    返回brokeredMessage;
}

我写一个集成测试来检查这个工程通过运行 SendMessage函数然后使用的服务总线浏览器2.0 。我们这样做是为了确保我们能够修复并使用工具来修改XML重新发送消息。消息我送这个样子的:

  [DataContract]
公共类TestServiceBusMessage
{
    [数据成员]
    公众的Guid ExternalIdentifier {搞定;组; }    [数据成员]
    公众诠释标识{搞定;组; }    [数据成员]
    公共字符串名称{;组; }
}

问题是;当邮件正文的工具看,而不是看起来像XML它,而不是出来象下面这样:

<$p$p><$c$c>@TestServiceBusMessageWhttp://schemas.datacontract.org/2004/07/IntegrationTests.Common.Azure.ServiceBus i)http://www.w3.org/2001/XMLSchema-instance@ExternalIdentifier?$13d81b90-d932-437f-a11c-9106412b6c4a@
标识符和放大器?; @名称?测试消息

我想这是一个编码问题;不过,我看不到的方式来设置通过身体到 BrokeredMessage 构造函数时编码;或定义它通过 DataContract 属性。

我将如何解决这个问题的编码?我需要提供我自己的串行 /的或有没有办法强制默认的序列化EN code是否正确?


解决方案

请尝试以下code。我测试了它,我可以用我的工具(Service Bus的资源管理器中看到XML格式的有效载荷:的http://$c$c.msdn.microsoft.com/windowsazure/Service-Bus-Explorer-f2abca5a#content).
基本上,你需要明确指定的DataContractSerializer在BrokeredMessage对象的构造函数。希望这可以帮助。
再见
保罗

 的#region MyRegion
使用系统;
使用System.Runtime.Serialization;
使用Microsoft.ServiceBus;
使用Microsoft.ServiceBus.Messaging;
#endregion空间计算器
{
    静态类节目
    {
        #地区的私人常量
        私人常量字符串QUEUENAME =计算器;
        私人常量字符串消息类型=消息类型;
        私人常量字符串的AssemblyName =的AssemblyName
        私人常量字符串的ConnectionString =&lt;您服务总线的命名空间的ConnectionString&gt;中;
        #endregion        #区域静态方法
        静态无效的主要()
        {
            发信息();
        }        异步静态无效的SendMessage()
        {
            尝试
            {
                //创建NamespaceManager对象
                VAR namespaceManager = NamespaceManager.CreateFromConnectionString(的ConnectionString);
                Console.WriteLine(NamespaceManager创建成功。);                //创建测试队列
                如果(!namespaceManager.QueueExists(QUEUENAME))
                {
                    namespaceManager.CreateQueue(新QueueDescription(QUEUENAME)
                    {
                        RequiresDuplicateDetection =假,
                        RequiresSession =假,
                        LockDuration = TimeSpan.FromSeconds(60)
                    });
                    Console.WriteLine(队列创建成功。);
                }                //创建MessagingFactory对象
                VAR messagingFactory = MessagingFactory.CreateFromConnectionString(的ConnectionString);
                Console.WriteLine(MessagingFactory创建成功。);                //创建messageSender,和对象
                VAR messageSender,和=等待messagingFactory.CreateMessageSenderAsync(QUEUENAME);
                Console.WriteLine(messageSender,和创建成功。);                //创建消息负载
                VAR testServiceBusMessage =新TestServiceBusMessage
                {
                    ExternalIdentifier = Guid.NewGuid(),
                    标识符= 1,
                    NAME =巴布
                };                //创建BrokeredMessage对象
                使用(VAR brokeredMessage =新BrokeredMessage(testServiceBusMessage,
                                                                 新的DataContractSerializer(typeof运算(TestServiceBusMessage)))
                {
                    属性= {{消息类型的typeof(TestServiceBusMessage).FullName},
                                  {的AssemblyName的typeof(TestServiceBusMessage).AssemblyQualifiedName}}
                })
                {
                    //发信息
                    messageSender.SendAsync(brokeredMessage).Wait();
                }
                Console.WriteLine(消息发送成功);
                Console.WriteLine(preSS [Enter]键,退出);
                到Console.ReadLine();
            }
            赶上(异常前)
            {
                Console.WriteLine(ex.Message);
                Console.WriteLine(preSS [Enter]键,退出);
                到Console.ReadLine();
            }
        }
        #endregion
    }    [DataContract]
    公共类TestServiceBusMessage
    {
        [数据成员]
        公众的Guid ExternalIdentifier {搞定;组; }        [数据成员]
        公众诠释标识{搞定;组; }        [数据成员]
        公共字符串名称{;组; }
    }
}

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天全站免登陆