Как читать из очереди Microsoft.Azure.ServiceBus, заполненной из CRM 2016 - PullRequest
0 голосов
/ 02 января 2019

Я хочу создать консольное приложение .NET Core 2.2, которое читает из Azure Service Bus Queue.Сообщения помещаются в очередь экземпляром CRM 2016.План состоит в том, чтобы использовать очередь для уведомления внешних устройств о создании и / или обновлении сущностей.

Я могу читать из очереди без проблем, используя следующий пример кода.

var queueClient = new QueueClient(serviceBusConnectionString, queueName);
...
var messageHandlerOptions = new MessageHandlerOptions(this.ExceptionReceivedHandler) {
    MaxConcurrentCalls = 1,
    AutoComplete = false
};

queueClient.RegisterMessageHandler(this.ProcessMessagesAsync, messageHandlerOptions);
...

protected async Task ProcessMessagesAsync(Message message, CancellationToken token) {
    // do something ??? with message body
    byte[] body = message.Body;

    await queueClient.CompleteAsync(message.SystemProperties.LockToken);
}

У меня нет проблем с чтением из очереди и получением сообщения , но я не уверен, что делать дальше .Кажется, что вся найденная мной документация примеров работает со старой версией библиотеки Azure Bus и .NET Framework.

Как только я получу свойство Body, что мне с ним делать?Я предполагаю, что мне нужно десериализовать или привести его как класс, но какой класс?

Примеры на этом сайте (https://docs.microsoft.com/en-us/dynamics365/customer-engagement/developer/sample-one-way-listener) имеют дело со старой библиотекой (https://www.nuget.org/packages/WindowsAzure.ServiceBus/). Примеры включают ссылкипо RemoteExecutionContext, BrokeredMessage (вместе с методом GetBody()), который, кажется, не применяется к более новой библиотеке.

Примеры на этом сайте (https://github.com/Azure/azure-service-bus/tree/master/samples) относятся к шине Azure вобщие и не имеют отношения к CRM.

Использую ли я правильную библиотеку? Разве я не использую Core? Может кто-нибудь указать мне на пример кода, который выполняется в .NET Core и взаимодействует с очередями и CRM?

1 Ответ

0 голосов
/ 03 января 2019

Старый ServiceBus SDK, кажется, делает некоторую десериализацию для вас, это вам нужно сделать сейчас.

Глядя на этот пример , кажется, что есть класс Dynamics с именем RemoteExecutionContext, который задокументирован здесь и читая это , он предлагает установить данные для отправки в формате JSON выглядят так, что по умолчанию может быть XML, но я понятия не имею.

Если данные отправляются в формате JSON, вы можете десериализовать, выполнив следующее:

protected async Task ProcessMessagesAsync(Message message, CancellationToken token) {

    var bytesAsString = Encoding.UTF8.GetString(message.Body);
    RemoteExecutionContext remoteExecutionContext = JsonConvert.DeserializeObject<RemoteExecutionContext>(bytesAsString);

    await queueClient.CompleteAsync(message.SystemProperties.LockToken);
}

Примечание:

Мне пришлось установить пакет nuget Microsoft.Xrm.SDK.2015, чтобы получить ссылку на класс RemoteExecutionContext, этот пакет собран с использованием .Net Framework, поэтому он не совместим должным образом с .Net Core

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...