带有RabbitMQ的Rebus接受来自Python的请求

问题描述 投票:1回答:1

我正在建立一个使用Rebus从RabbitMQ读取的.NET核心服务。似乎RabbitMQ中的请求需要具有.NET对象命名空间信息。有没有办法解决这个问题。例如,如果我使用Python编写的服务将项目放在队列中,则可以读取和处理这些请求。似乎每当我测试并尝试发送除.NET对象之外的东西时,我都会遇到异常。

System.Collections.Generic.KeyNotFoundException: Could not find the key 'rbs2-content-type' - have the following keys only: 'rbs2-msg-id'
rabbitmq rebus
1个回答
0
投票

这取决于您在接收端使用的串行器。

默认情况下,Rebus将使用其内置的JSON序列化程序,具有相当“有用”的设置,这意味着包含所有.NET类型名称。这样可以对复杂对象进行序列化,包括抽象/接口引用等。

该序列化器需要一些特殊的标题,例如, rbs2-content-type标头,用于验证传入消息是否为JSON(最有可能是将application/json; charset=utf-8作为其内容类型)。

如果要启用来自其他平台的消息的反序列化,我建议您在消息上提供必要的标题(至少使用Rebus的内置序列化程序 - 还包括要尝试反序列化的类型的.NET类型名称)。

另一个选择是安装自定义序列化程序,这是一件相当容易的事情 - 您可以通过注册序列化程序来开始:

Configure.With(...)
    .(...)
    .Serialization(s => s.Register(c => new YourCrazySerializer()))
    .Start();

然后你有点像这样实现:

public class YourCrazySerializer : ISerializer
{
    public async Task<TransportMessage> Serialize(Message message)
    {
        var headers = message.Headers.Clone();

        // turn into byte[] here
        //
        // possibly add headers

        return new TransportMessage(headers, bytes);
    }

    public async Task<Message> Deserialize(TransportMessage transportMessage)
    {
        var headers = transportMessage.Headers.Clone();

        // turn into object here
        //
        // possibly remove headers

        return new Message(headers);
    }
}

如您所见,修改Rebus以接受来自其他系统的消息非常容易。

© www.soinside.com 2019 - 2024. All rights reserved.