.net core 如何读取从CRM 2016填充的Microsoft.Azure.ServiceBus队列
我希望创建一个.net core 如何读取从CRM 2016填充的Microsoft.Azure.ServiceBus队列,.net-core,dynamics-crm,azure-servicebus-queues,.net Core,Dynamics Crm,Azure Servicebus Queues,我希望创建一个.NET Core 2.2控制台应用程序,它可以从Azure服务总线队列中读取数据。消息由CRM 2016实例放入队列。计划是在创建和/或更新实体时使用队列通知外部 使用以下示例代码,我能够从队列中读取数据而不会出现问题 var queueClient = new QueueClient(serviceBusConnectionString, queueName); ... var messageHandlerOptions = new MessageHandlerOptions(
.NET Core 2.2
控制台应用程序,它可以从Azure服务总线队列中读取数据。消息由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总线库和.NET Framework
一旦我拥有了Body
属性,我该如何处理它?我假设我需要反序列化或将其转换为类,但什么类
此站点()上的示例处理较旧的库()。这些示例包括对RemoteExecutionContext
,BrokeredMessage
(以及一个GetBody()
方法)的引用,该方法似乎不适用于较新的库
此站点()上的示例通常是关于Azure Bus的,不涉及CRM
我使用的是正确的库吗?我应该不使用核心吗?有人能告诉我运行在.NET Core
中并与队列和CRM交互的示例代码吗?旧的ServiceBus SDK似乎为您做了一些反序列化,您现在需要自己做
看一下,似乎有一个名为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);
}
受保护的异步任务流程MessagesAsync(消息消息、取消令牌){
var byteassString=Encoding.UTF8.GetString(message.Body);
RemoteExecutionContext RemoteExecutionContext=JsonConvert.DeserializeObject(ByteAssString);
wait queueClient.CompleteAsync(message.SystemProperties.LockToken);
}
注意:
我必须安装nuget软件包Microsoft.Xrm.SDK.2015
以获取对RemoteExecutionContext
类的引用,此软件包是使用.Net Framework构建的,因此与.Net Core不兼容。旧服务总线库使用的默认序列化程序在“Interop”命名空间下仍然可用,虽然它只需要一个流,所以您需要转换字节数组
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);
}
受保护的异步任务流程MessagesAsync(消息消息、取消令牌){
var反序列化程序=Microsoft.Azure.ServiceBus.InteropExtensions.DataContractBinarySerializer.Instance;
使用(var stream=newmemoryStream(message.Body))
{
RemoteExecutionContext RemoteExecutionContext=反序列化程序。读取对象(流)作为RemoteExecutionContext;
}
wait queueClient.CompleteAsync(message.SystemProperties.LockToken);
}
因此,您可以使用队列中的消息,但不知道如何写入队列-是这样吗?否。我们正在给队列写信。我可以从队列中读取消息。但是,当我使用.NET Core和新的Microsoft.Azure.ServiceBus
库从队列中读取消息时,我不确定如何处理消息对象的Body属性。旧库的所有文档和示例中的类在新库中不存在。我找不到任何.NET核心示例应用程序。是的。关于Microsoft.Xrm.SDK.*
中的类,我遇到了相同的问题,这些类仅适用于.NET Framework
。看来MS没有计划把它们转移过来。我想我可以尝试在RemoteExecutionContext
上复制属性子集,因为最终我需要的只是创建或修改的实体的id
。。。