Dynamics CRM2016 通过web api来调用自定义action

时间:2021-06-05 10:42:08

      action操作很早就已出现,今天要分享的是通过web api来调用action,该功能在online版本中非常有用,可以将js中复杂的逻辑操作放在处理能力更强的后端来做。

    首先咱们先简单的新建一个action,实体设置上可以设置为全局的,也可以单独设定某个实体,我这边的demo用的是案例实体

Dynamics CRM2016 通过web api来调用自定义action

    设置好后确定跳转到下一页,这一页需要设置唯一名称(后面调用代码中会用到),简单设置了两个输入参数一个输出参数,在步骤设置里我不做任何添加,设置完后保存并激活。

Dynamics CRM2016 通过web api来调用自定义action

    新建一个plugin项目,添加如下代码,代码非常简单,获取输入参数,计算后输出

using System;using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Xrm.Sdk;

namespace Action
{
public class Class1 : IPlugin
{
public void Execute(IServiceProvider serviceProvider)
{
IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService
(typeof(IPluginExecutionContext));

IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider
.GetService(typeof(IOrganizationServiceFactory));


IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);

EntityReference entityRef = context.InputParameters["Target"] as EntityReference;


Money money1 = context.InputParameters["Money1"] as Money;
Money money2 = context.InputParameters["Money2"] as Money;

Money sum = new Money(money1.Value + money2.Value);


context.OutputParameters["MoneySum"] = sum;
}
}
}


   下面来注册该action,方法同插件注册,在注册step时message选择我们的action的唯一名称

Dynamics CRM2016 通过web api来调用自定义action


    注册完后就是最后的js中调用了,注意request的url最后的写法Microsoft.Dynamics.CRM.【action唯一名称

  var entity = new Object();      entity["Money1"] = 1;      entity["Money2"] = 2;var req = new XMLHttpRequest()req.open("post", "http://121.40.75.24:5555/Origin/api/data/v8.0/incidents(03AE5852-6EFA-E511-9417-E2BFEC45B344)                  /Microsoft.Dynamics.CRM.new_testaction", false);    req.setRequestHeader("Accept", "application/json");    req.setRequestHeader("Content-Type", "application/json; charset=utf-8");    req.setRequestHeader("OData-MaxVersion", "4.0");    req.setRequestHeader("OData-Version", "4.0");        req.onreadystatechange = function () {        if (this.readyState == 4) {            if (this.status == 200) {               var result=JSON.parse(this.responseText);            }            else {                            }        }    };    req.send(JSON.stringify(entity));



    最后来看下输出结果

Dynamics CRM2016 通过web api来调用自定义action


    在on-premises的开发中我们往往把复杂的业务处理逻辑封装成接口供前端js调用,但在online的开发中这样的开发方式无疑增加了成本(需另外架设服务器,添置域名,配置https协议证书等),web api调用action给我们提供了新的可行的方式。