【问题标题】:Socket error sending message to Service Bus 1.0 queue向服务总线 1.0 队列发送消息的套接字错误
【发布时间】:2013-03-28 23:38:32
【问题描述】:

我正在关注 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 防火墙,但这也没有帮助。

我在事件查看器中启用了分析和调试日志,但在这些日志中我没有看到任何提示问题的内容。

如果有人对可能出现的问题或其他调试方法有任何建议,我将不胜感激。

【问题讨论】:

    标签: c# azure servicebus


    【解决方案1】:

    很高兴您已经解决了这个问题。

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      终于想通了,把它放在这里,这样同一条船上的其他人就可以避免与这个问题搏斗:

      显然,问题出在示例中使用 MessagingFactory 的某个地方。我不确定它的用途是什么(也许处理诸如 AMQP 之类的东西,Service Bus 还没有真正支持?),但你不需要它。您可以使用 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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-28
        • 1970-01-01
        • 1970-01-01
        • 2018-12-07
        • 2022-12-19
        • 1970-01-01
        • 2016-02-25
        相关资源
        最近更新 更多