使用 Azure.Messaging.ServiceBus.Administration 创建 ServiceBus 队列时出错

问题描述 投票:0回答:3

我(尝试)使用此代码来创建 ServiceBus 队列:

using Azure.Messaging.ServiceBus;
using Azure.Messaging.ServiceBus.Administration;
...
class blabla
{
   private string connectionString = "Endpoint=sb://XXXX.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=XXXYYY";
   private string queueName = "testqueue";
   ...
   public doit()
   {
    var adminClient = new ServiceBusAdministrationClient(connectionString);
    bool queueExists = adminClient.QueueExistsAsync(queueName).Result;
    if (!queueExists)
    {
        var options = new CreateQueueOptions(queueName)
        {
            DefaultMessageTimeToLive = TimeSpan.FromDays(2),
            LockDuration = TimeSpan.FromSeconds(45),
            MaxDeliveryCount = 8,
            MaxSizeInMegabytes = 2048
        };
        options.AuthorizationRules.Add(new SharedAccessAuthorizationRule(
            "allClaims",
            new[] { AccessRights.Manage, AccessRights.Send, AccessRights.Listen }));
        QueueProperties createdQueue = adminClient.CreateQueueAsync(options).Result;
    }

   }
}

但不断收到此错误:

System.AggregateException: One or more errors occurred. (SubCode=40900. Conflict. You're requesting an operation that isn't allowed in the resource's current state. To know more visit https://aka.ms/sbResourceMgrExceptions. . TrackingId:bc79fd98-73c8-4301-b6b9-05d0eae6ed6a_G17, SystemTracker:xxx.servicebus.windows.net:yyy, Timestamp:2021-05-09T00:24:57
Status: 409 (Conflict)
ErrorCode: 40900

使用来自 Microsoft.ServiceBus 的旧 (NET) 方式与 NamespaceManager 可以正常工作。

  var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);
  if (!namespaceManager.QueueExists(queueName))
  {
     namespaceManager.CreateQueue(queueName);
  }

那么,有人知道我在这里做错了什么吗? *

c# .net azure servicebus
3个回答
1
投票

以下是更新后的工作代码,您需要确保您具有具有完全访问权限的共享访问策略。

using Azure.Messaging.ServiceBus.Administration;
using System;
using System.Threading.Tasks;

namespace ServiceBusDemo
{
    class Program
    {
        private static string connectionString = "Endpoint=sb://ns-servicebusshu.servicebus.windows.net/;SharedAccessKeyName=fullAccess;SharedAccessKey=oB+IsK8Aqp0/xfXnF9HCz6x9pqPIOysTXaJofSmHEYs=";
        private static string queueName = "testqueue";

        async static Task Main(string[] args)
        {
            await doit();
        }
       
        public static async Task doit()
        {
            var adminClient = new ServiceBusAdministrationClient(connectionString);
            bool queueExists = await adminClient.QueueExistsAsync(queueName);

            if (!queueExists)
            {
                var options = new CreateQueueOptions(queueName)
                {
                    DefaultMessageTimeToLive = TimeSpan.FromDays(2),
                    LockDuration = TimeSpan.FromSeconds(45),
                    MaxDeliveryCount = 8,
                    MaxSizeInMegabytes = 2048
                };
                options.AuthorizationRules.Add(new SharedAccessAuthorizationRule("allClaims", new[] { AccessRights.Manage, AccessRights.Send, AccessRights.Listen }));

                QueueProperties createdQueue = await adminClient.CreateQueueAsync(options);
            }

        }
    }
}

运行应用程序后,它会成功创建队列,如下所示:


1
投票

也许这不是你的情况......但如果你有一个同名的主题,你尝试创建新的队列,QueueExistsAsync将返回

false
,但你会在创建时遇到这个奇怪的错误。修复很简单...更改队列名称或删除有问题的主题。


0
投票

抱歉造成混乱。 我的代码(以及 Rahul Shukla)现在正在运行。 我必须创建一些具有完全访问权限的新共享访问策略。 第三个创建的开始工作。 我之前创建的 2 个仍然无法工作。 创建的 3 个策略之间没有差异。因此我的回答中带有问号。 在 MS NET SB 论坛上发布了有关三分之一政策有效的问题。到目前为止还没有答案/确认。

© www.soinside.com 2019 - 2024. All rights reserved.