You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:51:39