Azure ServiceBus 订阅客户端 <--> 服务器通信(接收和响应)
Azure ServiceBus Subscription Client <--> Server communication (receive and respond)
我将如何处理客户端 <--> 服务器与 Azure 中的 ServiceBus 的通信?
目前我创建了一个新的队列名称"TestQueue"。我在队列上创建了一个名为 "TestTopic" 的主题,并且我订阅了一个正在使用 SqlFilterRule (Device = 'A').
监听名称 "DeviceA" 的订阅
然后我创建了一个客户端,它向上面指定的队列发送一个包,我在那里收到一条消息,我可以评估它,一切都很好。
现在我想向我的客户发回一些东西,也许我想 "keep talking" 给客户。所以我正在考虑来自 DeviceA(正在监听订阅)和客户端的 "direct" 连接,客户端正在与设备通信,同时也在监听订阅。
我希望你明白我想要什么,也许服务总线并不是我需要的...
让客户端拥有一个回复队列。然后,客户端可以在发送给最终接收者的消息的 ReplyTo 属性 上传递该队列的地址,然后接收者转身与该队列对话。这是一个常见的模式,也是为什么我们有 built-in 属性.
如果您跨 SB 名称空间使用此方法(即回复队列位于不同的名称空间中)或者您使用差异化访问控制,即仅客户端对目标 topic/queue 拥有 "send" 权限,并且不希望每个人都能够发送到自己的回复队列。
客户端将 short-lived 令牌传递给接收方以允许其发送回复的方法是这样的:
var token =
TokenProvider.CreateSharedAccessSignatureTokenProvider(
[[rulename]], [[key]])
.GetWebTokenAsync([[targetUri]], string.Empty, true,
TimeSpan.FromHours(1))
.GetAwaiter().GetResult();
在您的命名空间或具有 "Send" 权限的回复队列中有一个 SAS 规则,并将其用于 [[rulename]] 和 [[key]]。 [[targetUri]] 是回复队列的完全限定 URI(带有命名空间)。时间跨度表示该令牌的有效期。我在这里使用一个小时,但很可能是几秒钟或几分钟或一天。
然后您将该令牌与消息一起传递;它可以驻留在(自定义)消息 属性 中,命名为 "ReplyToToken"。
接收方从那个 属性 中获取令牌,然后用它创建一个令牌提供者
TokenProvider.CreateSharedAccessSignatureTokenProvider(tokenValue)));
然后您 create a fresh MessagingFactory 使用 ReplyTo 值和此令牌提供程序的基本 URI(无路径),然后 QueueClient 使用 ReplyTo 值的路径。
为了保持对话的进行,您可以将 QueueClient 和工厂保存在由 ReplyTo URI 键入的查找 table 中,而不是每次收到消息时都重新创建回复路径,而是从缓存中获取它.
我将如何处理客户端 <--> 服务器与 Azure 中的 ServiceBus 的通信?
目前我创建了一个新的队列名称"TestQueue"。我在队列上创建了一个名为 "TestTopic" 的主题,并且我订阅了一个正在使用 SqlFilterRule (Device = 'A').
监听名称 "DeviceA" 的订阅然后我创建了一个客户端,它向上面指定的队列发送一个包,我在那里收到一条消息,我可以评估它,一切都很好。
现在我想向我的客户发回一些东西,也许我想 "keep talking" 给客户。所以我正在考虑来自 DeviceA(正在监听订阅)和客户端的 "direct" 连接,客户端正在与设备通信,同时也在监听订阅。
我希望你明白我想要什么,也许服务总线并不是我需要的...
让客户端拥有一个回复队列。然后,客户端可以在发送给最终接收者的消息的 ReplyTo 属性 上传递该队列的地址,然后接收者转身与该队列对话。这是一个常见的模式,也是为什么我们有 built-in 属性.
如果您跨 SB 名称空间使用此方法(即回复队列位于不同的名称空间中)或者您使用差异化访问控制,即仅客户端对目标 topic/queue 拥有 "send" 权限,并且不希望每个人都能够发送到自己的回复队列。
客户端将 short-lived 令牌传递给接收方以允许其发送回复的方法是这样的:
var token =
TokenProvider.CreateSharedAccessSignatureTokenProvider(
[[rulename]], [[key]])
.GetWebTokenAsync([[targetUri]], string.Empty, true,
TimeSpan.FromHours(1))
.GetAwaiter().GetResult();
在您的命名空间或具有 "Send" 权限的回复队列中有一个 SAS 规则,并将其用于 [[rulename]] 和 [[key]]。 [[targetUri]] 是回复队列的完全限定 URI(带有命名空间)。时间跨度表示该令牌的有效期。我在这里使用一个小时,但很可能是几秒钟或几分钟或一天。
然后您将该令牌与消息一起传递;它可以驻留在(自定义)消息 属性 中,命名为 "ReplyToToken"。
接收方从那个 属性 中获取令牌,然后用它创建一个令牌提供者
TokenProvider.CreateSharedAccessSignatureTokenProvider(tokenValue)));
然后您 create a fresh MessagingFactory 使用 ReplyTo 值和此令牌提供程序的基本 URI(无路径),然后 QueueClient 使用 ReplyTo 值的路径。
为了保持对话的进行,您可以将 QueueClient 和工厂保存在由 ReplyTo URI 键入的查找 table 中,而不是每次收到消息时都重新创建回复路径,而是从缓存中获取它.