我正在设置一个使用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'
答案 0 :(得分:0)
这取决于您在接收端使用的是哪个序列化器。
默认情况下,Rebus将使用其内置的JSON序列化程序以及相当“有用”的设置,这意味着将包括所有.NET类型名称。这样可以序列化复杂对象,包括抽象/接口引用等。
此序列化程序需要一些特殊的标头,例如|
标头,它用于验证传入消息是否以JSON形式呈现(很可能是通过将rbs2-content-type
作为其内容类型)。
如果要启用来自其他平台的消息的反序列化,建议您在消息上提供必要的标头(至少使用Rebus的内置序列化程序,标头还应包括要尝试的类型的.NET类型名称。反序列化为)。
另一种选择是安装自定义序列化器,这是一件很容易的事情–您可以通过注册序列化器来开始,如下所示:
application/json; charset=utf-8
然后您将其实现如下:
Configure.With(...)
.(...)
.Serialization(s => s.Register(c => new YourCrazySerializer()))
.Start();
如您所见,修改Rebus以接受来自其他系统的消息非常容易。