我正在建立一个使用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'
这取决于您在接收端使用的串行器。
默认情况下,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以接受来自其他系统的消息非常容易。