如何在Azure中与ServiceBus进行客户端<->服务器通信?
当前,我创建了一个新的队列名称“ TestQueue”。我在队列上创建了一个名为“ TestTopic”的主题,并进行了订阅,该订阅使用SqlFilterRule(Device ='A')来监听名称“ DeviceA”。
然后,我创建了一个客户端,该客户端正在将包发送到上面指定的队列中,并且在那里接收消息,我可以对其进行评估,一切都很好。
现在,我想向客户发送一些消息,也许我想与客户“保持联系”。因此,我正在考虑从DeviceA(正在侦听订阅)和客户端(正在与设备通信,也正在侦听订阅)建立“直接”连接。
我希望你理解我想要的,也许服务总线并不是我真正需要的...
让客户拥有回复队列。然后,客户端可以在发送到最终接收者的消息的ReplyTo属性上传递该队列的地址,然后接收者转身并与该队列进行回话。这是一种常见的模式,也是为什么我们拥有该内置属性。
如果您在SB命名空间之间使用此方法(即,答复队列位于其他命名空间中)或使用区分访问控制,即客户端仅具有“发送”权限,则接收方还需要具有发送回该队列的权限。到目标主题/队列,并且不希望每个人都能够发送到其自己的回复队列。
客户端将短期令牌传递给接收者以允许其发送回复的方法是:
var token =
TokenProvider.CreateSharedAccessSignatureTokenProvider(
[[rulename]], [[key]])
.GetWebTokenAsync([[targetUri]], string.Empty, true,
TimeSpan.FromHours(1))
.GetAwaiter().GetResult();
在名称空间或答复队列中具有“发送”权限的SAS规则,并将其用于[[rulename]]和[[key]]。[[targetUri]]是回复队列(带有名称空间)的标准URI。时间跨度表示该令牌有效的时间。我在这里用了一个小时,但是可能要花几秒钟或几分钟甚至一天。
然后,您将该令牌与消息一起传递;它可以驻留在一个名为“ ReplyToToken”的(自定义)消息属性中。
接收者从该属性中获取令牌,然后使用它创建令牌提供者
TokenProvider.CreateSharedAccessSignatureTokenProvider(tokenValue)));
然后,您使用ReplyTo值的基本URI(无路径)和此令牌提供程序创建一个新的MessagingFactory,然后使用ReplyTo值的路径创建一个QueueClient。
为了使对话持续进行,您可以将QueueClient和factory保留在由ReplyTo URI键控的查找表中,而不是在每次收到消息时都重新创建答复路径,而是从缓存中获取消息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句