Ребус с RabbitMQ принимает запросы от Python - PullRequest
1 голос
/ 07 марта 2019

Я настраиваю базовую службу .NET, которая читает из RabbitMQ, используя Rebus. Похоже, что запрос, помещенный в RabbitMQ, должен иметь информацию о пространстве имен объекта .NET. Есть ли способ обойти это. Например, если бы у меня был сервис, написанный на Python, помещающий элементы в очередь, можно было бы прочитать и обработать эти запросы. Кажется, что каждый раз, когда я тестирую и пытаюсь отправить что-то, кроме объекта .NET, я получаю исключение.

System.Collections.Generic.KeyNotFoundException: Could not find the key 'rbs2-content-type' - have the following keys only: 'rbs2-msg-id'

1 Ответ

0 голосов
/ 07 марта 2019

Это зависит от того, какой сериализатор вы используете на приемном конце.

По умолчанию 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 для приема сообщений от других систем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...