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

EnL*_*cha 5 c# nservicebus

我创建了一个标准的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);
      }
   }
Run Code Online (Sandbox Code Playgroud)

这是我的消息发送者类,它将消息发送到另一个要发布的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));
      } 
   }
Run Code Online (Sandbox Code Playgroud)

我的总线初始化程序:

   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();
      }
   }
Run Code Online (Sandbox Code Playgroud)

我的留言班:

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

       public TrackEventMessages(string message)
       {
          HelloWorldMessage = message;
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,我对消息发布者的配置:

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>
Run Code Online (Sandbox Code Playgroud)

该配置由NServiceBus自动生成器创建。配置似乎正确。有没有人知道为什么在通过以下方式发送消息时为什么收到InvalidOperationException“消息未指定目的地”:

    Bus.Send(new TrackEventMessages(message));
Run Code Online (Sandbox Code Playgroud)

提前致谢。我在这上面花了太多时间。

*更新* *

我可能从我的MessagePubliser类中设置的总线不正确。我的目标是从另一个应用程序(wpf,控制台等)实例化MessagePublisher类。这就是为什么我使用BusInitializer类。但是,我正在创建的总线与MessagePublisher类中的app.config不相关。
有谁知道如何实例化MessagePublisher类,以便我的总线可以识别app.config?也许使用IWantToRunAtStartup?

EnL*_*cha 2

这个想法是使用 WPF 应用程序来初始化总线并将信息发送到发布者主机。我观看了 Udi 的 pub/sub 演示视频(请参阅 NServiceBus 网站进行在线培训),其中描述了使用仅发送 NServiceBus 主机作为 Web 应用程序向发布者发送消息。我使用了 WPF 应用程序而不是 Web 应用程序,它的工作非常顺利。

这是我的应用程序中的一些代码,可能对其他人有帮助。

应用程序配置:

<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>
Run Code Online (Sandbox Code Playgroud)

应用程序.xaml.cs:

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());
  }
}
Run Code Online (Sandbox Code Playgroud)

MainWindow.xaml.cs:(注意:您使用 App.Bus.Send() 发送消息。)

  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));
  }
Run Code Online (Sandbox Code Playgroud)

抱歉,我这么晚才发布答案安德烈亚斯。我会展示我回顾帖子的频率。:)