c# - 将 NServiceBus 事件从 v6 JSON 发布到 v4 XML 环境

标签 c# json xml nservicebus

我正在寻找一种方法来将事件从我们新的 NServiceBus 6 端点环境发布到旧的 v4 端点环境。更有趣的是,v6 使用 JSON 而 v4 使用 XML。

  • 我是否需要简单地在传入的 v4 端点上添加一个修改器?
  • 如何将 JSON 消息转换为 XML 消息?在上面提到的突变体中?
  • 我是否需要在传出事件消息中添加任何特定的 v4 消息 header ?

我使用 MSMQ 作为底层传输层。

最佳答案

前进的最简单方法可能是编写自定义序列化器定义。以下示例假定使用 NServiceBus v6 中可用的默认 XmlSerializer 和 JsonSerializer。

编写自定义序列化程序定义

public class CustomJsonSerializer : SerializationDefinition
{
    public override Func<IMessageMapper, IMessageSerializer> Configure(ReadOnlySettings settings)
    {
        var xmlSerializerDefinition = new XmlSerializer();
        var xmlSerializerFactory = xmlSerializerDefinition.Configure(settings);

        var jsonSerializerDefinition = new JsonSerializer();
        var jsonSerializerFactory = jsonSerializerDefinition.Configure(settings);
        return mapper => new DecoratorSerializer(xmlSerializerFactory(mapper), jsonSerializerFactory(mapper));
    }
}

编写一个具有自定义逻辑的序列化器装饰器,以将消息类型转发到 XmlSerializer(如果它们是针对 V4 端点的)。

class DecoratorSerializer : IMessageSerializer
{
    IMessageSerializer xmlSerializer;
    IMessageSerializer jsonSerializer;

    public DecoratorSerializer(IMessageSerializer xmlSerializer, IMessageSerializer jsonSerializer)
    {
        this.xmlSerializer = xmlSerializer;
        this.jsonSerializer = jsonSerializer;
    }

    public void Serialize(object message, Stream stream)
    {
        if (message.GetType() == typeof(MyMessage))
        {
            xmlSerializer.Serialize(message, stream);
        }
        else
        {
            jsonSerializer.Serialize(message, stream);
        }
    }

    public object[] Deserialize(Stream stream, IList<Type> messageTypes = null)
    {
        return jsonSerializer.Deserialize(stream, messageTypes);
    }

    public string ContentType
    {
        get { return jsonSerializer.ContentType; }
    }
}

像下面这样使用 CustomSerializer

endpointConfiguration.UseSerializer<CustomJsonSerializer>();

可以在 this github repo 上找到工作示例.该示例使用命令,但该方法也适用于 PubSub。唯一需要注意的是特定消息类型将始终使用一种格式。因此,不可能在 Xml 中发布一次相同的事件,而在 Json 中发布其他事件。

关于c# - 将 NServiceBus 事件从 v6 JSON 发布到 v4 XML 环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45585066/

相关文章:

C#按原样获取一个tcp数据包数据

c# lambda 表达式根据不同列表中的给定条件从列表中删除项目

c# - 如何在等待 ReadLine 时更新 C# Windows 控制台应用程序中的当前行?

c# - 如何在 Entity Framework 中基于旧实体创建新实体?

c# - 使用属性和 ServiceStack.Text.JsonSerializer 的自定义序列化

c# - JSON.parse Html 内容

json - 将所有属性集收集在一个样式表中并包含在principal.xsl中

java - 在 Java 中解析此 XML 的最简单方法?

xml - 在哪里保存大型博客文章数据 - 在文件或数据库中?

xml - 使用 xquery 存在数据库用户注册