NServiceBus:指定消息顺序

kee*_*pid 4 c# authentication messaging nservicebus

我在它自己的进程中使用NServiceBus(因此使用通用主机),我希望按特定顺序为消息提供多个消息处理程序.对于通用主机,您将实现ISpecifyMessageHandlerOrdering,但我不知道如何在托管您自己的NServiceBus进程时执行此操作,因为该接口已定义,NServiceBus.Host.exe并且我无法找到另一种方法来执行此操作.

这样做的目的是用户身份验证:在调用实际的消息处理程序之前,我首先要对消息的发送者进行身份验证,这将发生在不同的,更通用的消息处理程序中.该消息的类型包含加密的用户名和密码和/或会话ID.此类型将用于发送到服务器的几乎所有命令(我认为除了登录之外的所有命令).这是使用NServiceBus进行用户身份验证的好方法吗?

目前,它会选择第二个处理程序但不是正确的顺序.

更新

正如大卫所建议的那样,我尝试创建一个IMessageModule并从中读取标题CurrentMessageContext以对用户进行身份验证.

我遇到了一些问题:

  • 我第一次发送消息时,bus.CurrentMessageContextnull.每次之后,它都被正确填写,我可以阅读标题.
  • bus.DoNotContinueDispatchingCurrentMessageToHandlers在未对用户进行身份验证时调用不会阻止调用消息处理程序.也没有bus.Return(errorCode).还有其他方法吗?

Udi*_*han 7

如文档页面上的NServiceBus FAQ中所述:

http://docs.particular.net/nservicebus/handlers/handler-ordering

如何指定调用处理程序的顺序?

如果您正在编写自己的主持人:

NServiceBus.Configure.With()
 ...
 .UnicastBus()
      .LoadMessageHandlers(First<H1>.Then<H2>().AndThen<H3>().AndThen<H4>() //etc)
 ...
Run Code Online (Sandbox Code Playgroud)

如果您正在使用通用主机

public class EndpointConfig : IConfigureThisEndpoint, ISpecifyMessageHandlerOrdering
{
     public void SpecifyOrder(Order order)
     {
          order.Specify(First<H1>.Then<H2>().AndThen<H3>().AndThen<H4>() //etc);
     }
}
Run Code Online (Sandbox Code Playgroud)

如果您只想指定一个处理程序(使用您自己的主机)

NServiceBus.Configure.With()
     ...
     .UnicastBus()
          .LoadMessageHandlers<FIRST<YourHandler>>()
     ...
Run Code Online (Sandbox Code Playgroud)

如果您只想指定一个处理程序(使用通用主机)

public class EndpointConfig : IConfigureThisEndpoint, ISpecifyMessageHandlerOrdering
{
     public void SpecifyOrder(Order order)
     {
          order.Specify<FIRST<YourHandler>>();
     }
}
Run Code Online (Sandbox Code Playgroud)