C# NServiceBus-NServiceBus.Host作为发布者,WPF应用程序作为订阅者。如何?

C# NServiceBus-NServiceBus.Host作为发布者,WPF应用程序作为订阅者。如何?,c#,wpf,nservicebus,C#,Wpf,Nservicebus,我试图使用NServiceBus将消息从控制台进程(非常类似于启动NServiceBus.Host.exe的库中包含的PubSub示例)发送到我的WPF应用程序 这就是我所做的。 在WPF App.xaml类中,我定义了 public static IBus Bus; 同一类,在应用程序启动处理程序中: Bus = Configure.With().DefaultBuilder().BinarySerializer() .MsmqTransport().IsTransactional(true

我试图使用NServiceBus将消息从控制台进程(非常类似于启动NServiceBus.Host.exe的库中包含的PubSub示例)发送到我的WPF应用程序

这就是我所做的。 在WPF App.xaml类中,我定义了

public static IBus Bus;
同一类,在应用程序启动处理程序中:

Bus = Configure.With().DefaultBuilder().BinarySerializer()
.MsmqTransport().IsTransactional(true).PurgeOnStartup(false)
.UnicastBus().ImpersonateSender(false).LoadMessageHandlers()
.CreateBus()
.Start();

Bus.Subscribe<EventMessage>((message) =>
{
    switch (message.EventType)
    {
        case EventType.CreateSingleStay:
            break;
        case EventType.MoveToStartUpState:
        case EventType.MoveToOperativeState:
        case EventType.MoveToOutOfOrderState:
            break;
        case EventType.InputSignalDetected:

            break;
    }
    return true;
});

namespace PlusMatic.EventsTest
{
公共类TestPlusMacServerEndpoint:IWantToRunAtStartup
{
公共IBus总线{get;set;}
私有线程_loopConsole;
#Iwanttor项目的区域实施
公开募捐
{
string readLine=string.Empty;
bool publishIEvent=true;
while(readLine!=“j”)
{
readLine=Console.readLine();
var eventMessage=publishIEvent
?Bus.CreateInstance()
:neweventmessage();
...
发布(eventMessage);
WriteLine(“Id为{0}的已发布事件”,eventMessage.EventId);
publishIEvent=!publishIEvent;
}
}
公共停车场()
{
}
}
}
这是我的活动课

    namespace PlusMatic.EventsTest
    {
        [Serializable]
        public class EventMessage : IEvent
        {
            public Guid EventId { get; set; }
            public DateTime? Time { get; set; }
            public EventType EventType { get; set; }
            public MoveToStateEvent NextApplicationState { get; set; }
            public InputEvent InputSignal { get; set; }
            public IProductCard<Card> Card { get; set; }
        }
        public interface IEvent : IMessage
        {
            Guid EventId { get; set; }
            DateTime? Time { get; set; }
            IProductCard<Card> Card { get; set; }
            EventType EventType { get; set; }
            MoveToStateEvent NextApplicationState { get; set; }
            InputEvent InputSignal { get; set; }
        }
    }
namespace PlusMatic.EventsTest
{
[可序列化]
公共类事件消息:IEvent
{
公共Guid事件ID{get;set;}
公共日期时间?时间{get;set;}
public EventType EventType{get;set;}
public MoveToStateEvent下一个应用程序状态{get;set;}
公共InputEvent InputSignal{get;set;}
公共IP卡{get;set;}
}
公共接口事件:IMessage
{
Guid EventId{get;set;}
日期时间?时间{get;set;}
IProductCard{get;set;}
EventType EventType{get;set;}
MoveToStateEvent下一个应用程序状态{get;set;}
InputEvent InputSignal{get;set;}
}
}
publisher中的App.config:

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

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

就这样。 什么都不管用。 我从控制台项目发布事件,但在我的WPF应用程序中没有发生任何事情

也许我需要更多的练习…;)

我使用的是NServiceBusVersion3.0,它在RC4版本中,但我想这不是问题所在

感谢任何能帮忙的人

我发现了问题。 我订阅了一个“EventMessage”(实现了“IEvent”->实现了“IMessage”)并发布了一个“IEvent”

找到了问题。
我订阅了一个“EventMessage”(实现了“IEvent”->实现了“IMessage”)并发布了一个“IEvent”

请注意,我认为MsmqTransportConfig在NServiceBus 3中无效,我非常确定您需要通过fluent Config执行此操作,发布服务器端定义的端点
PlusMaticPublisherInputQueue
在哪里?如果您使用NServiceBus.Integration配置文件启动控制台应用程序,您在输入队列中看到订阅消息了吗?没有,没有订阅消息。此外,我还解决了有关NSB新版本3.0的一些“细节”,它需要如下配置
并且我根据在抛出的异常(!)中找到的指令更改了发布者输入队列的名称。在新版本中,将自动检测传输队列的名称,它是名称空间的名称(如果我理解正确的话)。l请注意,我认为MsmqTransportConfig在NServiceBus 3中无效,我非常确定您需要通过fluent Config执行此操作,发布服务器端定义的端点
PlusMaticPublisherInputQueue
在哪里?如果您使用NServiceBus.Integration配置文件启动控制台应用程序,您在输入队列中看到订阅消息了吗?没有,没有订阅消息。此外,我还解决了有关NSB新版本3.0的一些“细节”,它需要如下配置
并且我根据在抛出的异常(!)中找到的指令更改了发布者输入队列的名称。在新版本中,将自动检测传输队列的名称,它是名称空间的名称(如果我理解正确的话)。L
namespace PlusMatic.EventsTest
{
public class TestPlusMaticServerEndpoint : IWantToRunAtStartup
{
    public IBus Bus { get; set; }
    private Thread _loopConsole;

    #region Implementation of IWantToRunAtStartup

    public void Run()
    {
        string readLine = string.Empty;
        bool publishIEvent = true;
        while (readLine != "j")
        {
            readLine = Console.ReadLine();
            var eventMessage = publishIEvent
                                   ? Bus.CreateInstance<IEvent>()
                                   : new EventMessage();
...

            Bus.Publish(eventMessage);

            Console.WriteLine("Published event with Id {0}.", eventMessage.EventId);

            publishIEvent = !publishIEvent;
        }

    }
    public void Stop()
    {

    }
}
}
    namespace PlusMatic.EventsTest
    {
        [Serializable]
        public class EventMessage : IEvent
        {
            public Guid EventId { get; set; }
            public DateTime? Time { get; set; }
            public EventType EventType { get; set; }
            public MoveToStateEvent NextApplicationState { get; set; }
            public InputEvent InputSignal { get; set; }
            public IProductCard<Card> Card { get; set; }
        }
        public interface IEvent : IMessage
        {
            Guid EventId { get; set; }
            DateTime? Time { get; set; }
            IProductCard<Card> Card { get; set; }
            EventType EventType { get; set; }
            MoveToStateEvent NextApplicationState { get; set; }
            InputEvent InputSignal { get; set; }
        }
    }
    <configSections>
        <section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core" />
    </configSections>

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