我想在将消息发布到rebus时捕获有关当前用户的信息,以便处理程序和sagas可以透明和正确地访问应用程序用户信息。我在源代码中有点迷失,但基本上我正在尝试设置几个东西:
发布消息时运行的挂钩并将当前用户信息放入标题
收到邮件时在工作程序中运行的挂钩,并重写ClaimsPrincipal.Current。
处理完成后在工作程序中运行的挂钩,并重置ClaimsPrincipal.Current。
任何建议将不胜感激。
答案 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中描述的行为配置器在接收端建立当前主体