【发布时间】:2013-11-22 10:06:28
【问题描述】:
配置 Rebus 总线时,您可以指定它应该查找 Headers.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())
【问题讨论】:
标签: c# asp.net-web-api rebus