我在使用Bus.SendToQueues时遇到错误,在问题结尾处有详细错误。
我设置了一个带有存储帐户和密钥的azure队列,我正在尝试使用Bus.SendToSites使用msmq将内部服务总线处理程序发送到azure站点。
按照http://support.nservicebus.com/customer/portal/articles/859548-the-gateway-and-multi-site-distribution尝试获取网关,我正在使用此配置:
App.config:(我是否正确设置了网站?)
<section name="GatewayConfig" type="NServiceBus.Config.GatewayConfig, NServiceBus.Core" />
<GatewayConfig>
<Sites>
<Site Key="Azure" Address="http://<!--STORAGE ACCOUNT NAME-->.queue.core.windows.net/<!--STORAGE ACCOUNT KEY-->" ChannelType="Http"/>
</Sites>
</GatewayConfig>
处理程序:
Bus.SendToSites(new[] { "Azure" }, message);
在运行时,我得到以下内容:
错误: 无法向地址发送消息:分发服务器的数据地址,用作此端点发送的消息的返回地址..gateway @ HFORTE
内部异常:{“格式名称无效。”}
堆栈跟踪: 在System.Messaging.MessageQueue.MQCacheableInfo.get_WriteHandle() 在System.Messaging.MessageQueue.StaleSafeSendMessage(MQPROPS属性,ITransaction事务) 在System.Messaging.MessageQueue.StaleSafeSendMessage(MQPROPS属性,IntPtr事务) 在System.Messaging.MessageQueue.SendInternal(Object obj,MessageQueueTransaction internalTransaction,MessageQueueTransactionType transactionType) 在System.Messaging.MessageQueue.Send(Object obj,MessageQueueTransactionType transactionType) 在NServiceBus.Transports.Msmq.MsmqMessageSender.Send(TransportMessage消息,地址)中:第0行
我看到传输是MSMQ - 问题是,MSMQ和Azure是不同的传输协议,如果是这样,这是如何解决的?
答案 0 :(得分:2)
要使用网关,您必须在双方都托管NSB - 发件人和收件人。网关只为NSB端点打开WCF服务,因此您可以使用HTTP协议发送消息。
MSMQ和Azure队列传输无法在一个解决方案中组合,因为IBus实例是每个单独的单例。我们必须使用RavenDb开发自己的“桥梁”服务。我们选择了Raven,因为它具有RX驱动的事件订阅机制,也很容易使用。由于RavenDb是一个文档数据库,因此我们也可以保存消息(包含在一些容器中)而不需要太多的跳舞。
答案 1 :(得分:0)
您网站的地址不应该是Azure队列的地址。它应该是NServiceBus接收网关通道的地址。
在这种情况下,Azure队列和NSB网关都使用HTTP只是巧合。
您的发件人(在内部托管)将具有此配置
<GatewayConfig>
<Sites>
<Site Key="Azure" Address="https://some.address.com" ChannelType="Http"/>
</Sites>
</GatewayConfig>
Azure上托管的NSB端点将具有此网关配置
<GatewayConfig>
<Channels>
<Channel ChannelType="Http" Address="https://some.address.com" Default="True"/>
</Channels>
</GatewayConfig>