我有Service Bus 1.1。在前提下。但那部分可能并不重要。
我为我的队列设置了SharedAccess安全性。每个队列都分配了一个SharedAccessKey
代码看起来像这样:
/* \packages\WindowsAzure.ServiceBus.2.1.4.0\lib\net40-full\Microsoft.ServiceBus.dll */
using Microsoft.ServiceBus;
using Microsoft.ServiceBus.Messaging;
ServiceBusConnectionStringBuilder sbcsb = /* not shown */;
NamespaceManager nsm = new NamespaceManager(sbcsb.GetAbsoluteManagementEndpoints(), tp);
QueueDescription currentQueueDescription = new QueueDescription("MyQueueOne");
currentQueueDescription.SupportOrdering = false;
currentQueueDescription.LockDuration = "1000";
ICollection<AccessRights> accessRightsCollection = new List<AccessRights> { AccessRights.Listen, AccessRights.Manage, AccessRights.Send };
string currentRandomKeyName = "MyListenManageSendKeyName" + Guid.NewGuid().ToString("N");
string currentRandomKeyValue = SharedAccessAuthorizationRule.GenerateRandomKey();
currentQueueDescription.Authorization.Add(new SharedAccessAuthorizationRule(currentRandomKeyName, currentRandomKeyValue, accessRightsCollection.ToArray()));
nsm.CreateQueue(currentQueueDescription);
假设我创建了3个队列:
MyQueueOne
KeyName = MyListenManageSendKeyName11111111111111111111111111111111
KeyValue = abc1230000000000000000000000000000000000000
(code not shown, but same idea as the above)
MyQueueTwo
KeyName = MyListenManageSendKeyName22222222222222222222222222222222
KeyValue = def4560000000000000000000000000000000000000
MyQueueThree
KeyName = MyListenManageSendKeyName33333333333333333333333333333333
KeyValue = ghi7890000000000000000000000000000000000000
稍后,我将代码调用到GetAllQueues。
如下所示。请注意,我使用的是共享密钥访问,最初是为MyQueueOne创建的。
string currentKeyName = "MyListenManageSendKeyName11111111111111111111111111111111";
string currentKeyValue = "abc1230000000000000000000000000000000000000";
ServiceBusConnectionStringBuilder sbcsb = /* not shown */
TokenProvider tp = TokenProvider.CreateSharedAccessSignatureTokenProvider(currentKeyName, currentKeyValue);
NamespaceManager nsm = new NamespaceManager(sbcsb.GetAbsoluteManagementEndpoints(), tp);
IEnumerable<QueueDescription> allQueues = nsm.GetQueues();
当我调用.GetAllQueues()方法时,我会回来
MyQueueOne
MyQueueTwo
MyQueueThree
这是预期的行为吗?
在我有限的观点中,该特定密钥只会带回MyQueueOne。
我能做些什么才能找回“属于”特定SharedAccessAuthorizationRule的队列吗?
答案 0 :(得分:1)
这是预期的行为吗?在我的有限观点中,该特定密钥只会带回MyQueueOne
不,如果我们使用MyQueueOne共享密钥访问来获取队列列表,那么将得到401错误。我相信如果我们想要列出队列,我们需要使用默认的 RootManageSharedAccessKey 。我还会使用您的代码对其进行测试,并在尝试GetAllQueues
时收到401错误。
如果我使用了 RootManageSharedAccessKey ,那么你可以提到结果。
我能做些什么才能找回“属于”特定SharedAccessAuthorizationRule的队列吗?
如果想获得特定的SharedAccessAuthorizationRule,我们需要使用 RootMangeSharedAccesskey 生成TokenProvider
,然后过滤我们想要的结果,以下是我的测试代码和结果。
TokenProvider.CreateSharedAccessSignatureTokenProvider("RootManageSharedAccessKey", "xxxxxx");
IEnumerable<QueueDescription> allQueues = nsm.GetQueues().Where(queue=>queue.Authorization.Count(auth => auth.KeyName.Equals(currentKeyName))>0);