1

我正在使用新的 Azure ServiceBus SDK,它是 .NET Standard 2.0,我发现很难使用 SAS 令牌。以前,它曾经是 MessagingFactory,但在新的 SDK 中它不存在。ServiceBusConnectionStringBuilder 具有 SAS 令牌,但它也需要一个连接字符串。

基本上,我想使用 SAS 策略(用于发送的发送规则和用于接收的接收规则)和从这些策略的连接字符串创建的 SAS 令牌来发送和接收。

我能够生成 SAS 令牌,但找不到使用此令牌创建 QueueClient 的方法。

4

1 回答 1

2

我最终使用了以下ServiceBusConnectionStringBuilder使用 SharedAccess 签名的覆盖:

public ServiceBusConnectionStringBuilder (string endpoint, string entityPath, string sharedAccessSignature);

基于此,这是我编写的代码。这首先会生成一个RootManagedAccessKey有效期为一小时的 SAS 令牌,然后使用该令牌将消息发送到队列。

using System;
using System.Text;
using Microsoft.Azure.ServiceBus;
using Microsoft.Azure.ServiceBus.Primitives;

namespace SO60273377
{
    class Program
    {
        static void Main(string[] args)
        {
            var endpoint = "sb://<namespace>.servicebus.windows.net/";
            var queueName = "test";
            var keyName = "RootManageSharedAccessKey";
            var keyValue = "<key>";
            var validityDuration = TimeSpan.FromHours(1);

            TokenScope tokenScope = TokenScope.Entity;

            var provider = (SharedAccessSignatureTokenProvider) TokenProvider.CreateSharedAccessSignatureTokenProvider(keyName, keyValue, validityDuration, tokenScope);

            var token = provider.GetTokenAsync(endpoint+queueName, validityDuration).GetAwaiter().GetResult();
            var sasToken = token.TokenValue;
            Console.WriteLine("SAS Token: " + sasToken);
            var serviceBusConnectionStringBuilder = new ServiceBusConnectionStringBuilder(endpoint, queueName, sasToken);
            QueueClient client = new QueueClient(serviceBusConnectionStringBuilder, ReceiveMode.PeekLock);
            client.SendAsync(new Message(Encoding.UTF8.GetBytes("This is a test"))).GetAwaiter().GetResult();


            Console.WriteLine("Press any key to continue");
            Console.ReadLine();
        }
    }
}
于 2020-02-18T11:17:01.007 回答