Crm到Azure ServiceBus事件接收器,无法找到已更新的属性

时间:2017-02-21 10:15:12

标签: azureservicebus dynamics-crm-online azure-servicebus-queues

这是一个紧凑版本,请询问您是否需要澄清:

我已设法注册一个端点,以便在我更新Dynamics CRM Online中的属性(例如电话号码)时,会向Azure Service Bus发送一条消息(主题和/或队列,此处没有区别)。我还有一个webjob,使用下面的签名来监听这些变化:

public static void ProcessTopicMessage([ServiceBusTrigger("my-crm-topic", "topic-subscription1" )] BrokeredMessage pQueueItem, TextWriter log)
{
   RemoteExecutionContext package = pQueueItem.GetBody<RemoteExecutionContext>();

   if(package.MessageName == "Update")
   {
      Entity entity = pPackage.InputParameters["Target"] as Entity;            
      var newPhone = entity.GetAttributeValue<string("telephone1");    

   }        
}

这项工作正常,当我更改电话号码时,我可以阅读新的电话号码,所有其他属性都为空。但是,我无法找到有关已更改的属性/属性的名称/ ID的任何信息(除非它们不为空)。

我可以循环遍历所有属性名称并对此感到满意,但主要问题是无法知道该属性是否从其他内容设置为null。

我找不到任何关于pQueueItem或package-properties中已更改的电话号码的指示。我在哪里找到它?

3 个答案:

答案 0 :(得分:1)

我尝试复制你正在做的事情,因为我从未捕获过更新,只是创建消息。

我捕获了原始JSON,并且当我将联系人电话号码添加到以前空白字段中时,我只会看到新值,而且该消息仅包含更新后的字段。没有其他事情发生。

当我删除该值时,我基本上得到相同的JSON。只有具有新值&#34;&#34;的更改字段或空字符串。似乎也有同样的规则。

见下面的Telephone1。根据这个实验,你可以像你说的那样遍历属性......如果它在那里,它已经被改为现场的当前值。

谢谢, 乔。

"InputParameters": [
{
  "key": "Target",
  "value": {
    "__type": "Entity:http:\/\/schemas.microsoft.com\/xrm\/2011\/Contracts",
    "Attributes": [
      {
        "key": "telephone1",
        "value": ""
      },
      {
        "key": "contactid",
        "value": "c50fe891-a0f0-e611-8120-c4346b"
      },
      {
        "key": "modifiedon",
        "value": "\/Date(1487772895000)\/"
      },
      {
        "key": "modifiedby",
        "value": {
          "__type": "EntityReference:http:\/\/schemas.microsoft.com\/xrm\/2011\/Contracts",
          "Id": "6343f538-cde0-48ba-b249-b67ec24e765a",
          "KeyAttributes": [

          ],
          "LogicalName": "systemuser",
          "Name": null,
          "RowVersion": null
        }
      },
      {
        "key": "modifiedonbehalfby",
        "value": null
      }
    ],
    "EntityState": null,
    "FormattedValues": [

    ],
    "Id": "c50fe891-a0f0-e611-8120-c4346bb5984c",
    "KeyAttributes": [

    ],
    "LogicalName": "contact",
    "RelatedEntities": [

    ],
    "RowVersion": null
  }
}

答案 1 :(得分:0)

  

我已设法注册一个端点,以便在我更新Dynamics CRM Online中的属性(例如电话号码)时,会向Azure Service Bus发送一条消息(主题和/或队列,此处没有区别)。我还有一个听取这些变化的webjob

如果您想要检索WebJobs中已更新属性的消息实体的属性,您可以尝试将其他自定义属性设置为BrokeredMessage对象,以指示当前消息实体的属性是否已更新。

BrokeredMessage message = new BrokeredMessage(mes);
message.Properties["isupdated"] = 1;

然后您可以create filter for your topic subscription仅限制带有isupdated > 0的邮件可以传递到此主题订阅的虚拟队列。通过这种方式,您可以创建一个WebJob来处理传递给此特定主题订阅的消息,以处理更新的消息实体。

答案 2 :(得分:0)

得到答案from another forum 基本上,检查entity.Attributes-array(参见相关代码)。最后4个总是在更新时,n首先是已更改的属性的名称/新值。