具有错误System.InvalidOperationException的NServiceBus WCF服务:命令和事件都不支持Reply

时间:2014-04-09 21:09:43

标签: c# wcf nservicebus

执行Bus.Reply()后,这是我在日志文件中遇到的错误:

System.InvalidOperationException:命令和事件都不支持回复。应使用bus.Send和总线将命令发送给其逻辑所有者。应使用bus.Publish发布事件。

我有一个DotNet WCF服务,我在下面的代码中使用Global.asax进行了如下配置:

我正在使用 Bus.Sends(消息)从主机服务DLL进行调用 在WCF服务上,我调用 Bus.Reply(responseMessage)

我希望这是全双工,以便我可以在完成后对客户端进行回调,但我似乎无法正确配置。我已经加载了 NServiceBus -version 4.4.2 Only ,就像配置Web服务一样。我看到的例子是全双工加载 NServiceBus.Host ,但这似乎不对,在IIS下运行???

我错过了什么?

提前致谢:)

namespace MapQuest.Service
{
using log4net;
using NServiceBus;
using NServiceBus.Installation.Environments;
using System.IO;
using System.Web;

public class ServiceBus
{
    public static IBus Bus { get; private set; }
    public static ILog Log { get; private set; }

    public static void Init()
    {
        if (Bus != null)
            return;

        lock (typeof(ServiceBus))
        {
            if (Bus != null)
                return;

            Bus = Configure.With()
                .Log4Net()
                .DefiningCommandsAs(t => t.Namespace != null && t.Namespace.EndsWith("Commands")
                   && t.Namespace.StartsWith("Regions"))
               .DefiningEventsAs(t => t.Namespace != null && t.Namespace.EndsWith("Events")
                   && t.Namespace.StartsWith("Regions"))
               .DefiningMessagesAs(t => t.Namespace != null && t.Namespace.EndsWith("Messages")
                   && t.Namespace.StartsWith("Regions"))
               .DefiningEncryptedPropertiesAs(p => p.Name.StartsWith("Encrypted"))
                .DefineEndpointName("MapQuest.Service")
                .DefaultBuilder()
                .UseTransport<Msmq>()
                .PurgeOnStartup(true)
                .UnicastBus()
                .LoadMessageHandlers()
                .CreateBus()
                .Start();


            log4net.Config.XmlConfigurator.Configure();
            Log = LogManager.GetLogger(typeof(ServiceBus));


        }
    }
}
}

2 个答案:

答案 0 :(得分:2)

对于完全双工,关键是要确保为Bus.SendBus.Reply使用通用消息(您的类应继承自IMessage,或者您的命名空间需要以Messages结尾{1}}正如您的流体配置所述。)

如果您正在执行Bus.Reply到命令或事件,您将获得System.InvalidOperationException: Reply is neither supported for Commands nor Events例外。

答案 1 :(得分:1)

这个例外是为了阻止滥用/滥用命令和事件,但是当你从一个更加单一的架构过渡时,有一些有效的情况,你可能需要这样做。

解决方案是创建一个用于回复/响应的不同消息类型,并将原始消息对象作为属性放入其中。