将消息发送到Service Bus 1.0队列的套接字错误

时间:2013-03-28 23:38:33

标签: c# azure servicebus

我正在关注this tutorial,并且我不断收到调用QueueClient.Send()的异常。

首先,这是我在App.Config中的连接字符串设置({computername}替换为实际的机器名称):

<add key="Microsoft.ServiceBus.ConnectionString" value="Endpoint=sb://{computername}/ServiceBusDefaultNamespace;StsEndpoint=https://{computername}:9355/ServiceBusDefaultNamespace;RuntimePort=9354;ManagementPort=9355" />

这是我正在运行的代码:

NamespaceManager namespaceManager = NamespaceManager.Create();

TokenProvider nameSpaceManagerTokenProvider = TokenProvider.CreateWindowsTokenProvider(
    new List<Uri>() { namespaceManager.Address }, new NetworkCredential(user, password));

TokenProvider messagingToken = TokenProvider.CreateWindowsTokenProvider(
    new List<Uri>() { namespaceManager.Address }, new NetworkCredential(user, password));

namespaceManager.Settings.TokenProvider = nameSpaceManagerTokenProvider;

MessagingFactorySettings messageFactorySettings = new MessagingFactorySettings {TokenProvider = messagingToken};

MessagingFactory messagingFactory = MessagingFactory.Create(namespaceManager.Address, messageFactorySettings);

if (namespaceManager.QueueExists(QueueName))
{
    namespaceManager.DeleteQueue(QueueName);
}

QueueDescription qd = new QueueDescription(QueueName);

namespaceManager.CreateQueue(qd);

QueueClient myQueueClient = messagingFactory.CreateQueueClient(QueueName);

BrokeredMessage sendMessage = new BrokeredMessage("Hello, World!");

myQueueClient.Send(sendMessage); // <---- This is where I'm getting the exception

删除/创建队列没有问题。调用.Send()方法会出现以下错误:

Microsoft.ServiceBus.Messaging.MessagingCommunicationException

“套接字连接已中止。这可能是由于处理消息时出错或远程主机超出接收超时或基础网络资源问题引起的。本地套接字超时为'00:00:59.9579976'。 “

内部异常只是“现有连接被远程主机强行关闭”

这是堆栈跟踪:

   at Microsoft.ServiceBus.Messaging.Sbmp.SbmpMessageSender.EndSendCommand(IAsyncResult result)
   at Microsoft.ServiceBus.Messaging.Sbmp.SbmpMessageSender.OnEndSend(IAsyncResult result)
   at Microsoft.ServiceBus.Messaging.Sbmp.SbmpMessageSender.OnSend(TrackingContext trackingContext, IEnumerable`1 messages, TimeSpan timeout)
   at Microsoft.ServiceBus.Messaging.MessageSender.Send(TrackingContext trackingContext, IEnumerable`1 messages, TimeSpan timeout)
   at Microsoft.ServiceBus.Messaging.MessageSender.Send(BrokeredMessage message)
   at Microsoft.ServiceBus.Messaging.QueueClient.Send(BrokeredMessage message)
   at SBDemo.Program.Main(String[] args) in c:\Users\hartez\Documents\bitbucket\SBDemo\SBDemo\Program.cs:line 51
   at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()

我目前正在Windows 7 64位开发框上运行客户端代码和服务总线。我最初在2012 Server机器上运行Service Bus并遇到了同样的问题。

WindowsTokenProviderOauthTokenProvider都会出现问题。用户帐户是管理员(希望这只是权限问题);这似乎没有帮助。我也尝试过停用Windows防火墙,但这也无济于事。

我在事件查看器中启用了分析和调试日志,但我没有在这些日志中看到任何内容来表明问题可能是什么。

如果有人对可能出现的问题有任何建议,或者有其他方法对此进行调试,我会非常感激。

2 个答案:

答案 0 :(得分:3)

很高兴你已经弄明白了。

  
    

MessagingFactory messagingFactory = MessagingFactory.Create(namespaceManager.Address,messageFactorySettings);

  

您在原始代码中遇到的问题是它正在使用MessagingFactory的NamespaceManager地址。 MessagingFactory使用与NamespaceManager不同的端口。

NamespaceManager用于管理(CRUD)操作,SB有一个管理端点。

MessagingFactory用于运行时操作(Send / Receive / ..),SB有一个运行时endoiunt。

QueueClient.Create(QueueName)在内部创建一个消息传递工厂,并使用默认地址和端口进行运行时操作。

答案 1 :(得分:1)

最后想出来了,把它放在这里,所以同一条船上的任何人都可以避免摔跤这个问题:

显然,问题是在示例中使用MessagingFactory的某个地方。我不确定它甚至是什么(可能处理像AMQP这样的东西,但服务总线还没有真正支持它?),但你不需要它。您可以使用QueueClient.Create()创建客户端。我修改了代码看起来像这样,现在它工作得很好:

NamespaceManager namespaceManager = NamespaceManager.Create();

TokenProvider nameSpaceManagerTokenProvider = TokenProvider.CreateWindowsTokenProvider(
    new List<Uri>() { namespaceManager.Address }, new NetworkCredential(user, password));

namespaceManager.Settings.TokenProvider = nameSpaceManagerTokenProvider;

if (namespaceManager.QueueExists(QueueName))
{
    namespaceManager.DeleteQueue(QueueName);
}

QueueDescription qd = new QueueDescription(QueueName);

namespaceManager.CreateQueue(qd);

QueueClient myQueueClient = QueueClient.Create(QueueName);

BrokeredMessage sendMessage = new BrokeredMessage("Hello, World!");

myQueueClient.Send(sendMessage);