Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net core 如何读取从CRM 2016填充的Microsoft.Azure.ServiceBus队列_.net Core_Dynamics Crm_Azure Servicebus Queues - Fatal编程技术网

.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
。。。