如何使用rebus发布时捕获上下文信息

时间:2015-07-22 17:56:08

标签: rebus

我想在将消息发布到rebus时捕获有关当前用户的信息,以便处理程序和sagas可以透明和正确地访问应用程序用户信息。我在源代码中有点迷失,但基本上我正在尝试设置几个东西:

  1. 发布消息时运行的挂钩并将当前用户信息放入标题

  2. 收到邮件时在工作程序中运行的挂钩,并重写ClaimsPrincipal.Current。

  3. 处理完成后在工作程序中运行的挂钩,并重置ClaimsPrincipal.Current。

  4. 任何建议将不胜感激。

1 个答案:

答案 0 :(得分:2)

你可以使用Rebus'事件配置器挂钩MessageSent事件,无论何时发送传出消息(即发送以及发布和回复),都会触发此事件:

 Configure.With(...)
     .(...)
     .Events(e => e.MessageSent += AutomaticallySetUsernameIfPossible)
     .(...)

然后您的AutomaticallySetUsernameIfPossible可能会执行以下操作:

void AutomaticallySetUsernameIfPossible(IBus bus, string destination, object message)
{
    var principal = Thread.CurrentPrincipal;
    if (principal == null) return;

    var identity = principal.Identity;
    if (identity == null) return;

    var name = identity.Name;
    if (string.IsNullOrWhitespace(name)) return;

    bus.AttachHeader(message, Headers.UserName, name);    
}

以自动将当前经过身份验证的用户名称转移到所有外发邮件。

我建议您使用内置的rebus-username标头来传输用户名,因为Rebus可以使用它来使用the wiki page about user context中描述的行为配置器在接收端建立当前主体