C# 没有为消息指定目标,但我的NServiceBus配置似乎设置正确

C# 没有为消息指定目标,但我的NServiceBus配置似乎设置正确,c#,nservicebus,C#,Nservicebus,我已经创建了一个标准的NServiceBus发布-订阅程序。向我的发布服务器NServicBus主机发送消息时,我不断收到以下错误: 没有为消息TrackEventPublisher.TrackEventPublisher.InternalMessages.TrackEventMessages指定目标。无法发送消息。检查配置文件中的UnicastBusConfig部分,并确保该消息类型存在MessageEndpointMapping 嗯。。。。MessageEndpointMapping存在 以

我已经创建了一个标准的NServiceBus发布-订阅程序。向我的发布服务器NServicBus主机发送消息时,我不断收到以下错误:

没有为消息TrackEventPublisher.TrackEventPublisher.InternalMessages.TrackEventMessages指定目标。无法发送消息。检查配置文件中的UnicastBusConfig部分,并确保该消息类型存在MessageEndpointMapping

嗯。。。。MessageEndpointMapping存在

以下是我用来测试MessagePublisher类的测试控制台应用程序代码:

class Program
   {
      static void Main(string[] args)
      {
         Console.WriteLine("Click enter to submit message.");
         Console.ReadLine();

         string aMessage = "Please Work!!!!!!!!";
         MessagePublisher publisher = new MessagePublisher();
         publisher.PublishEventMessage(aMessage);
      }
   }
下面是我的message sender类,它将消息发送到另一个要发布的NServiceBus发布服务器:

   public class MessagePublisher
   {
      public IBus Bus { get; set; }

      public MessagePublisher()
      {
         BusInitializer.Init();
         Bus = BusInitializer.Bus;
      }

      public void PublishEventMessage(string message)
      {
         Bus.Send(new TrackEventMessages(message));
      } 
   }
我的总线初始值设定项:

   class BusInitializer
   {
      public static IBus Bus { get; private set; }

      public static void Init()
      {
         Bus = NServiceBus.Configure.With()
             .Log4Net()
             .DefaultBuilder()
             .XmlSerializer()
             .MsmqTransport()
                 .IsTransactional(false)
                 .PurgeOnStartup(false)
             .UnicastBus()
                 .LoadMessageHandlers()
                 .ImpersonateSender(false)
             .CreateBus()
             .Start();
      }
   }
我的消息类:

namespace TrackEventPublisher.TrackEventPublisher.InternalMessages
{
    public class TrackEventMessages : IMessage
    {
       public string HelloWorldMessage { get; set; }

       public TrackEventMessages(string message)
       {
          HelloWorldMessage = message;
       }
    }
}
最后,我对消息发布者的配置:

namespace TrackEventPublisher.PublishManager
{
    public class EndpointConfig : IConfigureThisEndpoint, AsA_Server
    {
    }
}

<configuration>
  <configSections>
    <section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core" />
    <section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core" />
  </configSections>

  <MsmqTransportConfig InputQueue="PublishManager" ErrorQueue="error" NumberOfWorkerThreads="1" MaxRetries="5" />

  <UnicastBusConfig ForwardReceivedMessagesTo="">
    <MessageEndpointMappings>
      <add Messages="TrackEventPublisher.TrackEventPublisher.InternalMessages" Endpoint="TrackEventPublisher" />
    </MessageEndpointMappings>
  </UnicastBusConfig>
</configuration>
提前谢谢。我在这件事上花了太多时间了

*更新**

我可能在MessagePubliser类中设置了错误的总线。我的目标是从另一个应用程序(wpf、控制台等)实例化MessagePublisher类。这就是我使用BusInitializer类的原因。但是,我正在创建的总线与MessagePublisher类中的我的app.config不相关。

有人知道如何实例化MessagePublisher类以便我的总线识别app.config吗?也许使用IWantToRunAtStartup?

的想法是使用WPF应用程序初始化总线并将信息发送到发布服务器主机。我观看了Udi的pub/sub演示视频(在线培训请参见NServiceBus网站),其中描述了使用仅发送的NServiceBus主机作为web应用程序向发布者发送消息。我使用了WPF应用程序而不是web应用程序,它工作起来很有魅力

下面是我的应用程序中的一些代码,可以帮助其他人

App.Config:

<configuration>
  <configSections>
    <section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core" />
    <section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core" />
  </configSections>

  <MsmqTransportConfig ErrorQueue="error" NumberOfWorkerThreads="1" MaxRetries="5" />

  <UnicastBusConfig ForwardReceivedMessagesTo="">
    <MessageEndpointMappings>
      <add Messages="TrackEventPublisher.EventPublisher.InternalMessages" Endpoint="EventPublisher" />
    </MessageEndpointMappings>
  </UnicastBusConfig>
</configuration>

很抱歉,我这么晚才发布答案Andreas。我去展示一下我是多么频繁地回顾我的帖子。:)

TrackEventPublisher配置:您的TrackEventMessage是否位于自己的名为TrackEventPublisher.TrackEventPublisher.InternalMessages的项目中?是的,正如您所提到的,TrackEventMessage位于自己的项目中。Udi,我实际上是在看了你的酒吧/酒吧培训视频。我没有尝试使用send/receive NServiceBus主机作为我的消息发送者,而是创建了一个类似于演示中的web应用程序的WPF应用程序。它工作得很好!!我正在尝试使用WPF应用程序订阅服务器。你能看一下我在另一个帖子上发布的一个问题吗:谢谢你的帮助!为公共汽车欢呼!您似乎混淆了两种托管模式。您拥有endpoint config类,该类最终将与NServiceBus.Host.exe一起使用,但您拥有自己的控制台应用程序作为主机。在移动到您自己的主机之前,请尝试使用内置主机检查其余配置。您介意将此作为答案发布,以便我们可以关闭此主机吗?
<configuration>
  <configSections>
    <section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core" />
    <section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core" />
  </configSections>

  <MsmqTransportConfig ErrorQueue="error" NumberOfWorkerThreads="1" MaxRetries="5" />

  <UnicastBusConfig ForwardReceivedMessagesTo="">
    <MessageEndpointMappings>
      <add Messages="TrackEventPublisher.EventPublisher.InternalMessages" Endpoint="EventPublisher" />
    </MessageEndpointMappings>
  </UnicastBusConfig>
</configuration>
public partial class App : Application
{
  public static IBus Bus { get; private set; }

  protected override void OnStartup(StartupEventArgs e)
  {
     base.OnStartup(e);

     Bus = NServiceBus.Configure.With()
         .DefineEndpointName("DemoExecutive")
         .Log4Net()
         .DefaultBuilder()
         .XmlSerializer()
         .MsmqTransport()
             .IsTransactional(false)
             .PurgeOnStartup(false)
         .UnicastBus()
             .ImpersonateSender(false)
         .CreateBus()
         .Start(() => Configure.Instance.ForInstallationOn<NServiceBus.Installation.Environments.Windows>().Install());
  }
}
  private void button1_Click(object sender, RoutedEventArgs e)
  {
     const long aNumber = 999999;
     var eventWhen = DateTime.Now;
     const string eventWhere = "Generic Kitchen";
     const string eventType = "Breakfast";
     const string aStatus = "Broken Toaster";

     var genericEventMessage = new GenericEventMessage
                                                  {
                                                     Number = aNumber,
                                                     EventWhen = eventWhen,
                                                     EventWhere = eventWhere,
                                                     EventType = eventType,
                                                     Status = aStatus
                                                  };

     App.Bus.Send(new TrackEventMesage(genericEventMessage));
  }