加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 21:31:20 所属栏目:百科 来源:网络整理
导读:我创建了一个标准的NServiceBus发布订阅程序.向我的发布商NServicBus主机发送消息时,我一直收到以下错误: 没有为消息TrackEventPublisher.TrackEventPublisher.InternalMessages.TrackEventMessages指定目标.消息无法发送.检查配置文件中的UnicastBusConfig
我创建了一个标准的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的pub / sub演示视频(请参阅NServiceBus网站进行在线培训),该视频描述了使用仅发送NServiceBus主机作为Web应用程序向发布者发送消息.我使用WPF应用程序而不是Web应用程序,它就像一个魅力.

以下是我的应用程序中可能有助于其他人的一些代码.

App.Config中:

<configuration>
  <configSections>
    <section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig,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));
  }

对不起,我这么晚才发布答案安德烈亚斯.我去看看我多久回顾一下我的帖子.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读