如何在MVC Core 2.2中用David Yack包装器执行MSCRM绑定自定义动作?
用David Yack的Dynamics WebAPI包装器执行绑定自定义动作
我完全理解你的痛点——在.NET Core环境下没法用传统的Dynamics SDK DLL,David的WebAPI包装器确实是最优解,但文档缺失确实让人摸不着头脑。我之前也碰到过类似的问题,刚好可以帮你把SDK里的代码转换成包装器的实现方式。
关键要点:绑定动作 vs 未绑定动作
首先要明确,你的new_GetProductBuyPrice是绑定到product实体的动作,所以不需要像SDK那样传Target参数——绑定动作的目标实体是通过API请求的URL来指定的,而不是请求体里的参数。这也是很多人踩坑的地方。
完整代码实现
假设你已经初始化好了DynamicsWebApi客户端(配置了CRM的BaseUrl和认证信息),下面是对应你SDK代码的实现:
using System; using System.Threading.Tasks; using DynamicsWebApi; using Microsoft.Xrm.Sdk; // 假设这些ID已经定义好 Guid productId = new Guid(ProductID); Guid accountId = new Guid(AccountID); Guid currencyId = new Guid(CurrencyID); // 初始化客户端(根据你的实际认证方式调整,比如OAuth) var dynamicsWebApi = new DynamicsWebApi(new DynamicsWebApiOptions { BaseUri = new Uri("https://your-crm-instance.crm.dynamics.com/api/data/v9.2/"), // 这里添加你的认证配置,比如ClientId、ClientSecret等 }); try { // 执行绑定自定义动作 var response = await dynamicsWebApi.ExecuteActionAsync( entitySetName: "products", // product实体的集合名称,注意复数形式 entityId: productId, // 绑定的目标product记录ID actionName: "new_GetProductBuyPrice", parameters: new { // 对应SDK里的Account参数 Account = new EntityReference("account", accountId), // 对应SDK里的Currency参数 Currency = new EntityReference("transactionalcurrency", currencyId), // 对应SDK里的Qty参数 Qty = 1.00m }); // 处理返回结果 decimal unitBuy = Math.Round(response["BuyPrice"].Value<decimal>(), 2); string discountReason = response.ContainsKey("DiscountReason") ? response["DiscountReason"].ToString() : string.Empty; } catch (Exception ex) { // 处理异常,比如权限问题、参数错误等 Console.WriteLine($"执行动作失败:{ex.Message}"); }
常见问题排查
如果还是失败,可以检查这几点:
- 实体集名称是否正确:确保用的是复数形式(比如
products而不是product),可以在CRM的WebAPI元数据文档里确认(路径:https://your-crm-instance.crm.dynamics.com/api/data/v9.2/$metadata) - 参数格式是否正确:如果
EntityReference传参有问题,可以改用匿名类格式适配WebAPI要求:Account = new { "@odata.type" = "#Microsoft.Dynamics.CRM.account", accountid = accountId } - 动作名称是否正确:要确保动作的逻辑名称完全匹配(CRM里一般不区分大小写,但最好和定义的完全一致)
补充说明
David的包装器底层是调用Dynamics WebAPI的REST接口,绑定动作的请求URL格式是:POST {base-url}/products({productId})/Microsoft.Dynamics.CRM.new_GetProductBuyPrice
包装器帮你封装了URL构建、参数序列化和认证的工作,所以你不用手动拼接这些内容。
内容的提问来源于stack exchange,提问作者user363727
相关产品推荐
相关产品推荐

