执行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));
}
}
}
}
答案 0 :(得分:2)
对于完全双工,关键是要确保为Bus.Send
和Bus.Reply
使用通用消息(您的类应继承自IMessage
,或者您的命名空间需要以Messages
结尾{1}}正如您的流体配置所述。)
如果您正在执行Bus.Reply到命令或事件,您将获得System.InvalidOperationException: Reply is neither supported for Commands nor Events
例外。
答案 1 :(得分:1)
这个例外是为了阻止滥用/滥用命令和事件,但是当你从一个更加单一的架构过渡时,有一些有效的情况,你可能需要这样做。
解决方案是创建一个用于回复/响应的不同消息类型,并将原始消息对象作为属性放入其中。