使用Dynamics 365,我正在做很多跳跃的事情,以完成需要完成的工作。
基本上,对于创建联系人,我有一个插件,该插件将Entity对象反序列化为XML,然后将该XML发布到Webhook。 Webhook对另一个系统进行了一些处理,并获取了ID。然后,该ID将返回给插件。
我已经在插件中设置了要设置此ID的属性,
var response = webClient.UploadString(serviceUrl, serializedStr);
postMessageImage["po_ContactCRPID"] = response.ToString();
没有错误发生,确实创建了联系人,但我要更新的字段未显示CRM中的值。
创建后,我无法在D365中使用常规的webhook函数,因为发布的JSON不允许您序列化回对象,然后才能很好地提取值,然后插入后端的其他系统中,所以我尝试使用尽可能多的强类型类。
关于如何实现此目标的任何想法?在后期操作管道上,我希望能够基于从某些Web服务返回的值在联系人对象(具有自定义字段)上设置属性,以便CRM可以使用我设置的值来创建联系人。
这是我的插件代码:
if (context.PostEntityImages.Contains("CreateContactImage") && context.PostEntityImages["CreateContactImage"] is Entity)
{
tracingService.Trace("AccountSync: CreateContactImage.");
Entity postMessageImage = (Entity)context.PostEntityImages["CreateContactImage"];
using (var client = new WebClient())
{
var webClient = new WebClient();
webClient.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
var code = "CodeFromPlugin";
var serviceUrl = this.CRPSyncServiceUrl + "?code=" + code;
var entitySeri = new EntitySerializer();
var serializedStr = entitySeri.SerializeObject(postMessageImage);
try
{
// upload the data using Post mehtod
//var response = webClient.UploadData(serviceUrl, entityBytes);
var response = webClient.UploadString(serviceUrl, serializedStr);
postMessageImage["po_ContactCRPID"] = response.ToString();
postMessageImage.Attributes["po_ContactCRPID"] = response.ToString();
tracingService.Trace("Set postMessageImage po_ContactCRPID to: {0}", response.ToString());
}
catch (Exception ex)
{
tracingService.Trace("WebEX Error: {0}", ex.ToString());
throw;
}
}
}
答案 0 :(得分:3)
在异步创建后插件中,您将在刚刚创建的联系人的目标中具有EntityId。
从webhook响应中获取ID,然后编写一个新的Contact对象,设置属性&service.Update
将其保存。
Entity contact = new Entity(“contact”);
contact.Id = target.Id;
contact[“webhook_Idfield”] = ID;
service.Update(contact);
答案 1 :(得分:2)
image
不是target
操作的create
。
image
仅为您提供特定事件之前或之后的记录值的只读快照。
target
通过事件管道传递。 target
代表一个可编辑对象,该对象已保存到数据库中。
例如;如果您考虑使用CreateRequest
,则它具有target
属性。该请求基本上就是用户保存记录时发生的事情。
Entity contact = new Entity("contact");
contact["firstname"] = "James";
CreateRequest cr = new CreateRequest
{
Target = contact
};
您可以这样在插件中访问target
:
Entity target = (Entity)context.InputParameters["Target"];
target.GetAttributeValue<string>("firstname"); //James
您可以像这样在target
上设置值:
target["lastname"] = "Wood";
“ Wood”将沿着事件管道传递并进入数据库,如果您的插件已针对同步和事前事件进行了注册。否则,当您设置target
时(例如事件后,异步),为时已晚-数据已保存到数据库中。
如果可以满足这些条件,请切换为使用target
。否则,您将需要发出单独的UpdateRequest
。
Entity update = new Entity("contact");
update.Id = target.Id;
update["lastname"] = "Wood";
Service.Update(update);