c# – 自动向Rebus消息添加标头

配置Rebus总线时,您可以指定它应查找Header.UserName标头,如
here所述.这允许您使用正确的用户名自动填充Thread.CurrentPrincipal.这很好用,但我想知道是否有一种很好的方法以标准方式设置标头,而不是在发送每条消息时手动设置标头.

我正在构建一个基于ASP.NET Web API的服务,并希望每个请求都将标头设置为apiControllerInstance.RequestContext.Principal.Identity.Name中的名称.

一个不错的解决方案是在基本ApiController上创建一个方法,该方法可以访问消息总线,因此您可以执行以下操作:

public IHttpActionResult SomeAction(SomeMessage message)
{
    SendWithUser(message);
    return Ok();
}

问题是你必须记住这样做,所以我想以更一般的方式得到一些关于如何做到这一点的建议.此外,其他标题可能在将来变得相关,这种方法也会产生问题.

更新

根据mookid的回答,我提出了以下解决方案(我刚刚确认它适用于我的一个请求,但我没有做出有关健壮性的承诺):

public static void SetUserNameHeaderWhenCurrentPrincipalIsPresent(this IRebusEvents events)
{
    events.MessageSent += (bus, destination, message) =>
    {
        if (HttpContext.Current.User != null && !string.IsNullOrWhiteSpace(HttpContext.Current.User.Identity.Name))
            bus.AttachHeader(message, Headers.UserName, HttpContext.Current.User.Identity.Name);
    };
}

用法:

.Events(e => e.SetUserNameHeaderWhenCurrentPrincipalIsPresent())

最佳答案 您可以使用

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

为每个传出消息调用SetUsername,这是你可以在HttpContext.Current上查找的地方

如果您认为缺少其他东西,请告诉我你的工作原理:)

点赞