我使用以下命令设置了请求-响应消息;
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>>
,但没有被调用。
答案 0 :(得分:0)
在消息契约中使用内部系统类型并不总是最佳选择,通常是因为您可能会尝试对BIOS对象进行序列化。建议将对象映射到消息契约定义的对象中,而不要依赖于内部系统类型。
也就是说,该消息可能正在发送,但是由于缺少程序集引用或其他内容而未能在接收端反序列化-再次,为什么最好不要使用系统类型进行序列化。您可能可以序列化它,但是在反序列化上却失败了,生成了ReceiveFault,或者只是发布了Fault
而不是Fault<StatusUpdateResponse>
,因为它无法反序列化该类型。>