Запрос / Ответ работает с примитивами, но не с Объектами - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть настройка сообщения запроса-ответа с использованием следующего:

public class StatusUpdateRequestConsumer : IConsumer<StatusUpdateRequest>
{
    private readonly IWmiService _wmiService;

    public StatusUpdateRequestConsumer(IWmiService wmiService)
    {
        _wmiService = wmiService;
    }

    public async Task Consume(ConsumeContext<StatusUpdateRequest> context)
    {
        var bios = _wmiService.GetBios();         

        await context.RespondAsync<StatusUpdateResponse>(
            new StatusUpdateResponse()
            {
                // This line works fine and message is sent back instantly
                Message = JsonConvert.SerializeObject(bios) //,
                // Sending the actual object instead of a JSON 
                // representation as so doesn't work
                // Bios = bios           
            }
        );
    }
}

При отправке строки, выполнив JsonConvert.SerializeObject () на моем объекте и отправив результат - сообщение получено мгновенно и все работает хорошо.

Когда я пытаюсь отправить сообщение с самим фактическим объектом (bios в приведенном выше примере), ответ никогда не принимается, но не выдается никаких исключений или ошибок.

Я думал, что MassTransit просто сериализует в JSON таким же образом перед отправкой сообщения, у кого-нибудь есть идеи, почему это не сработает - или какие-либо другие способы устранения неполадок, которые я могу применить, чтобы попытаться найти сообщение об ошибке, если таковое имеется?

Я попытался добавить IConsumer<Fault<StatusUpdateRequest>> и IConsumer<Fault<StatusUpdateResponse>>, но они не были вызваны.

1 Ответ

0 голосов
/ 05 сентября 2018

Использование внутренних типов системы в контрактах сообщений не всегда лучший выбор, как правило, из-за того, что вы можете увидеть при попытке сериализации объекта BIOS. Рекомендуется отобразить этот объект во что-то, что определяется договором о сообщениях, вместо того, чтобы полагаться на внутренний тип системы.

Тем не менее, сообщение может отправляться, но не может десериализоваться на принимающей стороне из-за отсутствующей ссылки на сборку или чего-то еще - опять же, почему лучше не использовать системные типы для сериализации. Возможно, вы сможете сериализовать его, но он не удастся выполнить при десериализации, сгенерирует ReceiveFault или, возможно, будет опубликовано только Fault вместо Fault<StatusUpdateResponse>, поскольку он не может десериализовать этот тип.

...