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

标签 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);
      }
   }

这是我的消息发送器类,它将消息发送到另一个要发布的 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>

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

    Bus.Send(new TrackEventMessages(message));

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

* 更新**

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

最佳答案

想法是使用 WPF 应用程序来初始化总线并将信息发送到发布者主机。我观看了 Udi 的发布/订阅演示视频(参见 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>

App.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());
  }
}

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));
  }

抱歉,我这么晚才发布答案安德烈亚斯。我去展示我多久回顾一次我的帖子。 :)

关于c# - 没有为消息指定目的地,但我的 NServiceBus 配置似乎设置正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9547666/

相关文章:

c# - Linq 与数组相交

nservicebus - 我们应该如何使用 nservicebus 处理长时间运行的进程

c# - 无法向 ServiceControl 注册端点启动

c# - 以编程方式在另一个窗口中单击鼠标

nservicebus - 零停机 NServiceBus 升级

c# - NServiceBus 警告 "No handlers could be found for message type"

c# - 使用NServiceBus时,MVVM中的ObservableCollection不变

c# - 使用 HttpWebrequest/HttpClient 调用 WebApi 2

c# - 围绕现有.net库生成.net dll包装器

c# - 针对 ActiveDirectory 进行身份验证