如何在收到的邮件中获取源地址?
背景是我正在为使用Rebus实现的服务总线设计监视器。我使用发布 - 订阅模式,因此总是在主题上发布消息。监视器订阅所有主题,以便监督服务发送了什么,因此是活着和健康的。虽然在消息处理程序中,收到的消息不包含任何标识服务发布的源地址或信息。这意味着无法监督哪些服务活跃且健康。当然我可以创建一个属性" Service"识别所有消息中的服务发布。这意味着每个服务都必须在发布消息之前设置属性,我觉得这有点麻烦。源地址在那里,可以识别服务发布。
答案 0 :(得分:0)
当您在Rebus消息处理程序中时,您可以访问IMessageContext
- 通过IoC容器注入它(这是更好的方式,因为可测试性得到改善),或者访问静态MessageContext.Current
属性。
消息上下文使您可以访问一些内容,其中传入传输消息的标头可用于获取消息的返回地址(默认情况下,该地址设置为发送方的输入队列)。
这样的事情可以解决问题:
public class SomeHandler : IHandleMessages<SomeMessage>
{
readonly IMessageContext _messageContext;
public class SomeHandler(IMessageContext messageContext)
{
_messageContext = messageContext;
}
public async Task Handle(SomeMessage message)
{
var headers = _messageContext.TransportMessage.Headers;
var returnAddress = headers[Headers.ReturnAddress];
// .. have fun with return address here
}
}