action操作很早就已出现,今天要分享的是通过web api来调用action,该功能在online版本中非常有用,可以将js中复杂的逻辑操作放在处理能力更强的后端来做。
首先咱们先简单的新建一个action,实体设置上可以设置为全局的,也可以单独设定某个实体,我这边的demo用的是案例实体
设置好后确定跳转到下一页,这一页需要设置唯一名称(后面调用代码中会用到),简单设置了两个输入参数一个输出参数,在步骤设置里我不做任何添加,设置完后保存并激活。
新建一个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的唯一名称
注册完后就是最后的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));
最后来看下输出结果
在on-premises的开发中我们往往把复杂的业务处理逻辑封装成接口供前端js调用,但在online的开发中这样的开发方式无疑增加了成本(需另外架设服务器,添置域名,配置https协议证书等),web api调用action给我们提供了新的可行的方式。