配置 Rebus 总线时,您可以指定它应该按照此处Headers.UserName
所述查找标头。这允许您自动填充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())