请求/响应适用于原语,但不适用于对象

时间:2018-09-05 12:00:34

标签: c# masstransit

我使用以下命令设置了请求-响应消息;

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,任何人都知道为什么此方法不起作用-或我可以进行其他任何故障排除以尝试发现所报告的错误(如果有的话)? / p>

我尝试添加IConsumer<Fault<StatusUpdateRequest>>IConsumer<Fault<StatusUpdateResponse>>,但没有被调用。

1 个答案:

答案 0 :(得分:0)

在消息契约中使用内部系统类型并不总是最佳选择,通常是因为您可能会尝试对BIOS对象进行序列化。建议将对象映射到消息契约定义的对象中,而不要依赖于内部系统类型。

也就是说,该消息可能正在发送,但是由于缺少程序集引用或其他内容而未能在接收端反序列化-再次,为什么最好不要使用系统类型进行序列化。您可能可以序列化它,但是在反序列化上却失败了,生成了ReceiveFault,或者只是发布了Fault而不是Fault<StatusUpdateResponse>,因为它无法反序列化该类型。