无法在NServiceBus中发布事件-消息类型无法由';Type.GetType';,扫描已知消息以查找匹配项

无法在NServiceBus中发布事件-消息类型无法由';Type.GetType';,扫描已知消息以查找匹配项,nservicebus,msmq,Nservicebus,Msmq,我在使用NServiceBus将事件发布到MSMQ时遇到了一个奇怪的问题。我可以使用IBus.send方法成功发送消息(我可以在MSMQ中找到发送的消息)。但是,当我尝试使用IBus.publish方法发布事件时,消息不会到达MSMQ。对于每个发布的消息,我只得到以下日志消息 [DEBUG] 2015-11-20 13:19:43.9444 Message type: 'MyAssembly.Messages.NewEmailEvent' could not be determined by a

我在使用NServiceBus将事件发布到MSMQ时遇到了一个奇怪的问题。我可以使用
IBus.send
方法成功发送消息(我可以在MSMQ中找到发送的消息)。但是,当我尝试使用
IBus.publish
方法发布事件时,消息不会到达MSMQ。对于每个发布的消息,我只得到以下日志消息

[DEBUG] 2015-11-20 13:19:43.9444 Message type: 'MyAssembly.Messages.NewEmailEvent' could not be determined by a 'Type.GetType', scanning known messages for a match 
事件定义如下所示

namespace MyAssembly.Messages
{
    public class NewEmailEvent
    {
        public Guid MessageId { get; set; }
        public string Subject { get; set; }
        public string Sender { get; set; }
        // a few other fields
    }
}
我使用以下代码发布事件

m_Bus.Publish<NewEmailEvent>(msg => {
    msg.MessageId = entry.MessageId;
    msg.Subject = entry.Email.Subject;
    msg.Sender = entry.Email.Sender.Name;
    // more property assignments
});
bus.Subscribe<NewEmailEvent>();
消息在启动时已正确注册

[DEBUG] 2015-11-20 13:18:35.1345 Message definitions: 
MessageType: MyAssembly.Messages.NewEmailEvent, Recoverable: True, TimeToBeReceived: Not set , Parent types: MyAssembly.Messages.NewEmailEvent
MessageType: NServiceBus.Scheduling.Messages.ScheduledTask, Recoverable: True, TimeToBeReceived: Not set , Parent types: NServiceBus.Scheduling.Messages.ScheduledTask
在接收端,我使用以下代码订阅事件

m_Bus.Publish<NewEmailEvent>(msg => {
    msg.MessageId = entry.MessageId;
    msg.Subject = entry.Email.Subject;
    msg.Sender = entry.Email.Sender.Name;
    // more property assignments
});
bus.Subscribe<NewEmailEvent>();
bus.Subscribe();
并使用以下配置

<MsmqTransportConfig InputQueue="Nsb_input" ErrorQueue="Nsb_errors" NumberOfWorkerThreads="1" MaxRetries="5" />
<MessageForwardingInCaseOfFaultConfig ErrorQueue="error" />
<UnicastBusConfig>
  <MessageEndpointMappings>
    <add Assembly="MyAssembly.Messages" Endpoint="NServiceBus.Service" />
  </MessageEndpointMappings>
</UnicastBusConfig>
<UnicastBusConfig>
  <MessageEndpointMappings>
    <add Assembly="MyAssembly.Messages" Endpoint="NServiceBus.Service" />
  </MessageEndpointMappings>
</UnicastBusConfig>
<MessageForwardingInCaseOfFaultConfig ErrorQueue="error" />

事件命名约定与服务相同。

您的MessageEndpointMappings对于发布者和订阅者都是相同的-不知道这是否正确/是否有区别

您尚未定义任何消息或命令约定;只有事件

busConfiguration.Conventions()
    .DefiningMessagesAs(t => t.Namespace != null &&
                         t.Namespace.StartsWith("MyAssembly.Messages"))
    .DefiningCommandsAs(t => t.Namespace != null &&
                         t.Namespace.StartsWith("MyAssembly.Commands"))
我认为如果你不使用,你需要这样做

我认为这在订户中尤其重要

您尚未包括您的订户的代码。它是否有一个实现IHandleMessages的类

回去看看这张照片

再次检查配置设置。看起来你没有使用外部文件;这些部分直接在app.config中

您的MessageEndpointMappings对于发布者和订阅者都是相同的-不知道这是否正确/是否有区别

您尚未定义任何消息或命令约定;只有事件

busConfiguration.Conventions()
    .DefiningMessagesAs(t => t.Namespace != null &&
                         t.Namespace.StartsWith("MyAssembly.Messages"))
    .DefiningCommandsAs(t => t.Namespace != null &&
                         t.Namespace.StartsWith("MyAssembly.Commands"))
我认为如果你不使用,你需要这样做

我认为这在订户中尤其重要

您尚未包括您的订户的代码。它是否有一个实现IHandleMessages的类

回去看看这张照片


再次检查配置设置。看起来你没有使用外部文件;这些部分直接位于app.config

中。您能展示您订阅的代码是什么样子吗?我用订阅应用程序的源代码和配置更新了我的问题。在“NServiceBus.Service”端点上是什么?我想说的是,你需要将订阅端的MessageEndpointMappings改为指向Nsb_输入。你解决问题了吗?消息约定是否同时应用于发布服务器和订阅服务器?它们是否相同?“NServiceBus.Service”是发送事件的应用程序的终结点(终结点名称是使用
BusConfiguration.EndpointName
设置的)。将订户端的MessageEndpointMappings更改为Nsb_输入后,我得到一个错误,即队列不存在。事实上,它并不存在。另一方面,nservicebus.service队列存在(nservicebus在启动时创建了它)。你能展示你订阅的代码是什么样子吗?我用源代码和订阅应用程序的配置更新了我的问题。“nservicebus.service”端点上是什么?我想说的是,你需要将订阅端的MessageEndpointMappings改为指向Nsb_输入。你解决问题了吗?消息约定是否同时应用于发布服务器和订阅服务器?它们是否相同?“NServiceBus.Service”是发送事件的应用程序的终结点(终结点名称是使用
BusConfiguration.EndpointName
设置的)。将订户端的MessageEndpointMappings更改为Nsb_输入后,我得到一个错误,即队列不存在。事实上,它并不存在。另一方面,存在nservicebus.service队列(nservicebus在启动时创建了它)。我对消息和命令的约定与对事件的约定类似。唯一的区别是,它们以“消息”和“命令”结束,而不是以“事件”结束。我只发布了事件的约定,以尽可能地缩短帖子。我在另一个应用程序中将处理程序作为一个公共类,它实现了
IHandleMessages
。然而,即使没有处理程序,我也不明白为什么事件没有在MSMQ中排队。当我发送消息而不是事件时,它们确实到达MSMQ。“消息”和“命令”-单数还是复数?我想几个月前我也遇到过类似的问题,结果证明公约很重要(即使用“信息”,而不是“信息”或完全像我最初那样的其他东西)。我可能只是记错了,但这不需要花很多时间来验证。>>>我在另一个应用程序中有处理程序。我对消息和命令的约定与对事件的约定类似。唯一的区别是,它们以“消息”和“命令”结束,而不是以“事件”结束。我只发布了事件的约定,以尽可能地缩短帖子。我在另一个应用程序中将处理程序作为一个公共类,它实现了
IHandleMessages
。然而,即使没有处理程序,我也不明白为什么事件没有在MSMQ中排队。当我发送消息而不是事件时,它们确实到达MSMQ。“消息”和“命令”-单数还是复数?我想几个月前我也遇到过类似的问题,结果证明公约很重要(即使用“信息”,而不是“信息”或完全像我最初那样的其他东西)。我可能只是记错了,但这不需要花很多时间来验证。>>>我在另一个应用程序中有这个处理程序