我希望创建一个.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/)有关。这些示例包括对Body
,RemoteExecutionContext
(以及BrokeredMessage
方法)的引用,这些引用似乎不适用于更新的库。
此网站(https://github.com/Azure/azure-service-bus/tree/master/samples)上的示例通常与Azure总线有关,不涉及GetBody()
。
我使用的是正确的库吗?我不应该使用Core吗?有人能指出我在CRM
中运行并与队列和CRM交互的示例代码吗?
答案 0 :(得分:1)
旧的ServiceBus SDK似乎为您进行了反序列化,您现在需要自己进行。
从this example看,似乎有一个名为documented here和reading 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);
}