修改传出的NServiceBus订阅消息的标头,以将信息传递给iaAuthorizeSubscriptions
我使用的是NServiceBus 4.4.2,我创建了一个类,该类实现了修改传出的NServiceBus订阅消息的标头,以将信息传递给iaAuthorizeSubscriptions,nservicebus,Nservicebus,我使用的是NServiceBus 4.4.2,我创建了一个类,该类实现了IAuthorizeSubscriptions,以便接受/拒绝订阅。我需要发布服务器中关于订阅者的一些附加信息,因此我尝试创建一个实现IMutateOutgoingTransportMessages的类,并使用ConfigureComponent(DependencyLifecycle.InstancePerCall)以正常方式注册它。这个类所做的只是在传出消息中添加一个头 不幸的是,当从订阅服务器发送时,订阅控制消息上没有
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实现不再用于传出订阅消息。很好的发现。谢谢你发布链接。虽然这确实让我感到难过,因为这已经不可能了。如果你单独发布,我可以将其标记为答案。