如何从CRM 2016填充的Microsoft.Azure.ServiceBus队列中读取

时间:2019-01-02 19:17:03

标签: .net-core dynamics-crm azure-servicebus-queues

我希望创建一个.NET Core 2.2读取的控制台应用程序。消息由Azure Service Bus Queue实例放入队列中。计划是在创建和/或更新实体时使用队列通知外部。

使用以下示例代码,我可以毫无问题地从队列中进行读取。

CRM 2016

我从队列中读取并收到消息没有问题,但我不确定下一步该怎么做。我发现的所有示例文档似乎都可以与旧版本的Azure Bus库和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); } 一起使用。

一旦拥有.NET Framework属性,该如何处理?我假设我需要反序列化或将其转换为一类,但是什么类?

此站点(https://docs.microsoft.com/en-us/dynamics365/customer-engagement/developer/sample-one-way-listener)上的示例与较早的库(https://www.nuget.org/packages/WindowsAzure.ServiceBus/)有关。这些示例包括对BodyRemoteExecutionContext(以及BrokeredMessage方法)的引用,这些引用似乎不适用于更新的库。

此网站(https://github.com/Azure/azure-service-bus/tree/master/samples)上的示例通常与Azure总线有关,不涉及GetBody()

我使用的是正确的库吗?我不应该使用Core吗?有人能指出我在CRM中运行并与队列和CRM交互的示例代码吗?

2 个答案:

答案 0 :(得分:1)

旧的ServiceBus SDK似乎为您进行了反序列化,您现在需要自己进行。

this example看,似乎有一个名为documented herereading this的名为RemoteExecutionContext的Dynamics类,它建议您可以设置数据以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不能正确兼容

答案 1 :(得分:0)

旧的服务总线库使用的默认序列化器在“ Interop”命名空间下仍然可用,尽管它只需要一个Stream,所以您需要转换字节数组。

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

    var deserializer = Microsoft.Azure.ServiceBus.InteropExtensions.DataContractBinarySerializer<RemoteExecutionContext>.Instance;

    using (var stream = new MemoryStream(message.Body))
    {
        RemoteExecutionContext remoteExecutionContext = deserializer.ReadObject(stream) as RemoteExecutionContext;
    }

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