使用网关的Nservicebus msmq到azure队列

时间:2014-02-03 14:57:27

标签: nservicebus gateway azure-queues

我在使用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是不同的传输协议,如果是这样,这是如何解决的?

2 个答案:

答案 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>