是否有人有使用 Azure ESB REST API 从主题/子接收消息的示例。
我可以点击订阅并获取订阅摘要详细信息,但无法了解如何单独或批量获取消息。
我查看了 Azure REST API,其中有队列示例和各种语言的 SDK 语言示例。 我想探索 REST 方法,因为这里回答了另一个类似的问题,并指出 SDK 是 REST API 的包装器。 所以我宁愿直接使用 REST API。
最初使用 Postman,但目的是从集成平台调用 API。
提前致谢。
尝试在 sbus url 上以及从服务总线资源管理器获取的 URL 上使用 GET 和 DELETE 动词。 本来期待一堆消息,但在这些动词上出现以下错误:
获取
400
提供的 api 版本“”不支持该请求。 TrackingId:de9fa084-0f97-4098-8a46-9193bd1e0ccd_G40,SystemTracker:sbus-pep-dev-ukso-001:主题:satesttopic,时间戳:2024-08-02T15:47:47
删除
400
指定的 HTTP 谓词 (DELETE) 无效。要了解更多信息,请访问 https://aka.ms/sbResourceMgrExceptions。 。 TrackingId:913095cc-f0e6-4b88-af2c-1db1c537e1c3_G40,SystemTracker:sbus-pep-dev-ukso-001:主题:satesttopic,时间戳:2024-08-02T15:48:13
我使用这个作为 URL:
sb://<my base url>/satesttopic/Subscriptions/SATessSub
这让我遇到了未经授权删除订阅的错误,这似乎完全合理。 和
sb://<my base url>/satesttopic/Subscriptions/SATessSub/messages
尝试获取一条消息或一批消息,这会导致删除错误。
我必须承认我不知道从哪里获取 API 版本。
感谢您查看此内容。
要使用 REST API 从 Azure 服务总线主题订阅接收消息,您需要使用
DELETE
方法以及适当的请求 URL 和标头。根据您的错误消息,您似乎遇到了 API 版本控制和 HTTP 动词问题,并且您没有使用正确的 REST API URL。
REST API URL 应采用以下格式:
https://{serviceNamespace}.servicebus.windows.net/{topicPath}/subscriptions/{subscriptionName}/messages/head
or
https://your-namespace.servicebus.windows.net/your-topic/subscriptions/your-subscription/messages/head
DELETE
HTTP 方法:对于主题订阅:
DELETE https://your-namespace.servicebus.windows.net/your-topic/subscriptions/your-subscription/messages/head?timeout=60 HTTP/1.1
Authorization: SharedAccessSignature sr=your-namespace&sig=Fg8yUyR4MOmXfHfj55f5hY4jGb8x2Yc%2b3%2fULKZYxKZk%3d&se=1404256819&skn=RootManageSharedAccessKey
Host: your-namespace.servicebus.windows.net
Content-Length: 0
private const string ServiceBusNamespace = "your_service_bus_namespace";
private const string SasKeyName = "your_sas_key_name";
private const string SasKey = "your_sas_key";
static void Main(string[] args)
{
string sasToken = GenerateSasToken(ServiceBusNamespace, SasKeyName, SasKey);
Console.WriteLine(sasToken);
}
private static string GenerateSasToken(string serviceBusNamespace, string sasKeyName, string sasKey)
{
string uri = $"https://{serviceBusNamespace}.servicebus.windows.net/";
string encodedResourceUri = HttpUtility.UrlEncode(uri);
string expiry = ((int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds + 3600).ToString();
string stringToSign = $"{encodedResourceUri}\n{expiry}";
using (var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(sasKey)))
{
string signature = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign)));
return $"SharedAccessSignature sr={encodedResourceUri}&sig={HttpUtility.UrlEncode(signature)}&se={expiry}&skn={sasKeyName}";
}
}
Sas 代币输出:
Azure 服务总线订阅消息:
使用 Postman 实现 Rest Api: