Клиент подписки Azure ServiceBus ‹--› Обмен данными с сервером (получение и ответ)

как мне подойти к взаимодействию клиента ‹--> сервера с ServiceBus в Azure?

В настоящее время я создал новую очередь с именем «TestQueue». Я создал тему в очереди, которая называется «TestTopic», и сделал подписку, которая прослушивает имя «DeviceA» с помощью SqlFilterRule (Device = 'A').

Затем я создал клиента, который отправляет пакет в указанную выше очередь, и я получаю там сообщение, могу оценить его, и все в порядке.

Теперь я хочу отправить что-то обратно своему клиенту, и, возможно, я хочу «продолжить разговор» с клиентом. Итак, я думаю о «прямом» соединении от DeviceA (которое прослушивает подписку) и клиента, который разговаривает с устройством, а также прослушивает подписку.

Надеюсь, вы понимаете, чего я хочу, а может служебный автобус - не совсем то, что мне нужно ...


person Ben K.    schedule 11.12.2015    source источник


Ответы (1)


Сделайте так, чтобы у клиента была очередь для ответов. Затем клиент может передать адрес этой очереди в свойстве 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)));

Затем вы создаете новый MessagingFactory, используя базовый URI (без пути ) значения ReplyTo и этого поставщика токенов, а затем QueueClient, используя путь значения ReplyTo.

Чтобы поддерживать диалог, вы можете затем удерживать QueueClient и factory в таблице поиска с ключом URI ReplyTo и не воссоздавать путь ответа каждый раз, когда вы получаете сообщение, а лучше брать его из кеша.

person Clemens Vasters    schedule 05.01.2016