修改传出的NServiceBus订阅消息的标头,以将信息传递给iaAuthorizeSubscriptions

修改传出的NServiceBus订阅消息的标头,以将信息传递给iaAuthorizeSubscriptions,nservicebus,Nservicebus,我使用的是NServiceBus 4.4.2,我创建了一个类,该类实现了IAuthorizeSubscriptions,以便接受/拒绝订阅。我需要发布服务器中关于订阅者的一些附加信息,因此我尝试创建一个实现IMutateOutgoingTransportMessages的类,并使用ConfigureComponent(DependencyLifecycle.InstancePerCall)以正常方式注册它。这个类所做的只是在传出消息中添加一个头 不幸的是,当从订阅服务器发送时,订阅控制消息上没有

我使用的是NServiceBus 4.4.2,我创建了一个类,该类实现了
IAuthorizeSubscriptions
,以便接受/拒绝订阅。我需要发布服务器中关于订阅者的一些附加信息,因此我尝试创建一个实现
IMutateOutgoingTransportMessages
的类,并使用
ConfigureComponent(DependencyLifecycle.InstancePerCall)
以正常方式注册它。这个类所做的只是在传出消息中添加一个头

不幸的是,当从订阅服务器发送时,订阅控制消息上没有设置头。我已经检查过,如果订阅者执行Bus.Send()操作,则我的自定义头将附加到传输消息的头集合中,因此我认为我的mutator没有问题,除非我需要以不同的方式注册它

是否有一种方法可以将头附加到订阅消息中,或者我的做法是错误的,应该通过其他方式传递信息

编辑:

public class MyMutator : IMutateOutgoingTransportMessages
{
    public void MutateOutgoing(object[] messages, TransportMessage transportMessage)
    {
        transportMessage.Headers.Add("CustomHeader", "Test");
    }
}
变异码:

public class MyMutator : IMutateOutgoingTransportMessages
{
    public void MutateOutgoing(object[] messages, TransportMessage transportMessage)
    {
        transportMessage.Headers.Add("CustomHeader", "Test");
    }
}
i授权订阅代码:

public class MyMutator : IMutateOutgoingTransportMessages
{
    public void MutateOutgoing(object[] messages, TransportMessage transportMessage)
    {
        transportMessage.Headers.Add("CustomHeader", "Test");
    }
}
我可以在
AuthorizeSubscribe
方法中设置断点,然后它会被命中,但是
不包含我的自定义头

public class SubscriptionAuthoriser : IAuthorizeSubscriptions
{
    public bool AuthorizeSubscribe(string messageType, string clientEndpoint, IDictionary<string, string> headers)
    {
        // headers doesn't contain the "CustomHeader" header

        return true;
    }

    public bool AuthorizeUnsubscribe(string messageType, string clientEndpoint, IDictionary<string, string> headers)
    {
        return true;
    }
}
公共类订阅作者:IAuthorizeSubscriptions
{
public bool AuthorizeSubscribe(字符串messageType、字符串clientEndpoint、IDictionary头)
{
//标题不包含“CustomHeader”标题
返回true;
}
public bool AuthorizeUnsubscribe(字符串messageType、字符串clientEndpoint、IDictionary头)
{
返回true;
}
}

从NServiceBus 4.3版开始,将不再对传出的订阅消息调用InvokeoutGoingTransportMessageStators,因此,对于消息头,这似乎不再可能。不久前我问了一个类似的问题。当我在前面提到的线程上等待响应时,我实现了一个临时解决方案,这是一种手动订阅方法(主要使用NServiceBus单播总线源构建)。这可能是不推荐的,但我想我无论如何都会发布它,以防它对某人有所帮助

public void Subscribe(Type eventType, Address targetAddress)
{
    var transportMessage = new TransportMessage
        {
            ReplyToAddress = Address.PublicReturnAddress,
            Recoverable = true
        };
        transportMessage.Headers.Add("NServiceBus.ControlMessage", true.ToString());
        transportMessage.Headers["SubscriptionMessageType"] = eventType.AssemblyQualifiedName;
        transportMessage.MessageIntent = MessageIntentEnum.Subscribe;

        var fdqn = OutgoingTransportMessageMutator.GetLocalhostFqdn();
        transportMessage.ReplyToAddress = new Address(transportMessage.ReplyToAddress.Queue, fdqn);

        string fullPath = MsmqUtilities.GetFullPath(targetAddress);
        try
        {
            using (var messageQueue = new MessageQueue(fullPath, false, false, QueueAccessMode.Send))
            {
                using (var message1 = MsmqUtilities.Convert(transportMessage))
                {
                    message1.UseDeadLetterQueue = false;
                    message1.UseJournalQueue = false;
                    message1.ResponseQueue = new MessageQueue(MsmqUtilities.GetReturnAddress(transportMessage.ReplyToAddress.ToString(), targetAddress.ToString()));
                    messageQueue.Send(message1, MessageQueueTransactionType.Single);
                }
            }
        }
        catch (MessageQueueException ex)
        {
            if (ex.MessageQueueErrorCode == MessageQueueErrorCode.QueueNotFound)
            {
                string message1 = targetAddress == (Address)null ? "Failed to send message. Target address is null." : string.Format("Failed to send message to address: [{0}]", targetAddress);
                throw new QueueNotFoundException(targetAddress, message1, ex);
            }
            throw;
        }
        catch (Exception ex)
        {
            _log.Error(ex);
            throw;
         }
     }

根据此对话(),从v4.3开始,IMutateOutgoingTransportMessages实现不再用于传出订阅消息。很好的发现。谢谢你发布链接。虽然这确实让我感到难过,因为这已经不可能了。如果你单独发布,我可以将其标记为答案。