配置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上查找的地方
如果您认为缺少其他东西,请告诉我你的工作原理:)