.net 使用服务SAS令牌在Azure队列中插入消息

fjnneemd  于 2023-11-20  发布在  .NET
关注(0)|答案(1)|浏览(143)

这是我第一次使用SAS。我试图使用Service SAS Token访问Azure队列,并尝试插入消息,但它不起作用。当我尝试从浏览器访问生成的URI时,我得到下面的错误
“资源不支持指定的Http Verb。RequestId:cc 1f 2356-f003-0015- 78 b6 - 15 f337000000 Time:2023-11- 12 T22:23:52.3942771Z”。可能是什么问题?下面是我的示例代码
注意:我将使用原始值替换AccountName、AccountName和AccountKey。

  1. public async Task<ApiResponse<BlobServiceClient>> GetServiceQueueSasToken()
  2. {
  3. ApiResponse<BlobServiceClient> result = new ApiResponse<BlobServiceClient>();
  4. try
  5. {
  6. string queueName = "queueName";
  7. string accountName = "accountName";
  8. string accountKey = "accountKey";
  9. StorageSharedKeyCredential storageSharedKeyCredential = new(accountName, accountKey);
  10. var serviceQueueUri = new Uri($"https://{accountName}.queue.core.windows.net/{queueName}");
  11. string sasToken = await CreateServiceQueueSASToken(storageSharedKeyCredential, queueName);
  12. BlobServiceClient blobServiceClientAccountSAS = new BlobServiceClient(new Uri($"{serviceQueueUri}? {sasToken}"));
  13. SendMessageUsingSasToken(blobServiceClientAccountSAS.Uri queueName, sasToken);
  14. result.Data = blobServiceClientAccountSAS;
  15. result.IsSucceed = true;
  16. }
  17. catch (Exception ex)
  18. {
  19. result.IsSucceed = false;
  20. result.Exception = ex;
  21. result.ErrorMessages = new List<string>();
  22. result.ErrorMessages.Add(ex.Message);
  23. }
  24. return result;
  25. }
  26. public static async Task<string> CreateServiceQueueSASToken(StorageSharedKeyCredential sharedKey, string queueName)
  27. {
  28. var queueSasBuilder = new QueueSasBuilder()
  29. {
  30. QueueName = queueName,
  31. ExpiresOn = DateTimeOffset.UtcNow.AddDays(1),
  32. Protocol = SasProtocol.Https
  33. };
  34. queueSasBuilder.SetPermissions(QueueSasPermissions.Add | QueueSasPermissions.Read);
  35. string sasToken = queueSasBuilder.ToSasQueryParameters(sharedKey).ToString();
  36. return sasToken;
  37. }
  38. static void SendMessageUsingSasToken(Uri serviceUri, string queueName, string sasToken)
  39. {
  40. var queueClient = new QueueClient(serviceUri, queueName, sasToken);
  41. queueClient.SendMessage("Your message content", sasToken);
  42. Console.WriteLine("Message sent successfully.");
  43. }

字符串

tez616oj

tez616oj1#

SendMessageUsingSasToken方法中使用SAS令牌的问题。QueueClient构造函数已经期望SAS令牌包含在URI中,因此在创建QueueClient时不需要再次将其作为参数传递。
下面的代码为Azure存储队列生成共享访问签名(SAS)令牌,并使用它将消息发送到指定的队列。

  1. using Azure.Storage;
  2. using Azure.Storage.Queues;
  3. using Azure.Storage.Sas;
  4. using Azure.Storage.Shared;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Threading.Tasks;
  8. public class ApiResponse<T>
  9. {
  10. public T Data { get; set; } = default!;
  11. public bool IsSucceed { get; set; }
  12. public Exception? Exception { get; set; }
  13. public List<string> ErrorMessages { get; set; } = new List<string>();
  14. }
  15. class Program
  16. {
  17. static void Main(string[] args)
  18. {
  19. var response = GetServiceQueueSasToken().Result; // Blocking call
  20. if (response.IsSucceed)
  21. {
  22. Console.WriteLine("SAS token generated successfully.");
  23. }
  24. else
  25. {
  26. Console.WriteLine($"Error: {response.Exception?.Message}");
  27. }
  28. }
  29. public static async Task<ApiResponse<QueueServiceClient>> GetServiceQueueSasToken()
  30. {
  31. ApiResponse<QueueServiceClient> result = new ApiResponse<QueueServiceClient>();
  32. try
  33. {
  34. string queueName = "AzurequeueName";
  35. string accountName = "AzureStorageAccountName ";
  36. string accountKey = "AzureStorageAccountAccountKey";
  37. StorageSharedKeyCredential storageSharedKeyCredential = new StorageSharedKeyCredential(accountName, accountKey);
  38. var serviceQueueUri = new Uri($"https://{accountName}.queue.core.windows.net");
  39. string sasToken = CreateServiceQueueSASToken(storageSharedKeyCredential, queueName);
  40. QueueServiceClient queueServiceClient = new QueueServiceClient(new Uri($"{serviceQueueUri}?{sasToken}"));
  41. SendMessageUsingSasToken(queueServiceClient, queueName);
  42. result.Data = queueServiceClient;
  43. result.IsSucceed = true;
  44. }
  45. catch (Exception ex)
  46. {
  47. result.IsSucceed = false;
  48. result.Exception = ex;
  49. result.ErrorMessages = new List<string> { ex.Message };
  50. }
  51. return result;
  52. }
  53. public static string CreateServiceQueueSASToken(StorageSharedKeyCredential sharedKey, string queueName)
  54. {
  55. var queueSasBuilder = new QueueSasBuilder
  56. {
  57. QueueName = queueName,
  58. ExpiresOn = DateTimeOffset.UtcNow.AddDays(1),
  59. Protocol = SasProtocol.Https
  60. };
  61. queueSasBuilder.SetPermissions(QueueSasPermissions.Add | QueueSasPermissions.Read);
  62. string sasToken = queueSasBuilder.ToSasQueryParameters(sharedKey).ToString();
  63. return sasToken;
  64. }
  65. static void SendMessageUsingSasToken(QueueServiceClient queueServiceClient, string queueName)
  66. {
  67. var queueClient = queueServiceClient.GetQueueClient(queueName);
  68. queueClient.SendMessage("Your message content");
  69. Console.WriteLine("Message sent successfully.");
  70. }
  71. }

字符串

输出:


的数据


展开查看全部

相关问题