D365 FO的Custom Service的实现比AX2012简单了很多。
AX2012服务方法要用属性SysEntryPointAttribute标记,添加到Services以后,还要发布服务并在系统管理入站端口添加操作,服务运行在CIL下,所以每次改动服务方法的代码都要增量生成CIL。
AX2012只支持SOAP,不支持Restful,个人偏爱Restful,主要是SOAP的代理类在不同的平台有说不清道不明的问题,在AX2012的时候,我是通过.NET WCF封装了一下,把SOAP封装成了Restful的服务。
在D365 FO这些问题都不是问题了,任何类都可以直接添加到Services节点,服务方法不需要再用SysEntryPointAttribute标记。只要把Services节点添加到Service Groups,D365 FO就直接把类里的方法
暴露成SOAP和Json-Based服务。
D365 FO没有称呼Restful服务而是称为json-based服务。
Restful和json-based这两个东西不是一个层面的东西,Restful是一种网络应用程序的设计风格和开发方式,Restful的数据传输既可以用json也可以用xml,也可以用其他格式。
在.NET WCF Restful实现里是通过Content-Type来识别的。根据Content-Type来决定调用方传过来的数据是什么格式的,可以是xml,json,也可以是text/plain。
D365 FO里的服务称为Json-base服务,顾名思义调用服务方法的时候入参和返回值都必须是合法的json格式。
这个跟WCF Restful的RequestFormat和ResponseFormat格式指定Json,http request的ContentType指定为json是一样的。
框架负责反序列化和序列化,个人不是很喜欢这种方式,异常不是很容易捕获,如果第三方传入的数据有问题,序列化失败会内部错误500,不好排错。
另外第三方提供的入参也不一定就是合法的json格式,可能就是一堆没有规律的字符串,传入以后再作分析可能更方便。
WCF Restful可以直接接收text/plain,方法入参用System.IO.Stream,接收以后再做分析。
既然D365 FO只支持Json格式,我觉得把第三方提供的数据都作为一个字符串,封装到json里,作为一个入参传入,方法接收以后再根据数据情况分析可能更灵活。
当然这个每个人都有自己的偏好,怎么实现都可以。
以D365提供的示例代码为例说明步骤:
1.创建类Class1,添加方法

 1 class Class12 {3     public str EchoString(str input)4     {5         return input;6     }7 8     public ComplexContract1 GetComplexContract()9     {
10         ComplexContract1 complexContract = new ComplexContract1();
11         List contractList = new List(Types::Class);
12         Contract1 contract = new Contract1();
13         contract.parmStringMember("SomeString");
14         contractList.addEnd(contract);
15         contract = new Contract1();
16         contract.parmStringMember("SomeString2");
17         contractList.addEnd(contract);
18         complexContract.parmContractList(contractList);
19         return complexContract;
20     }
21
22     public ComplexContract1 EchoComplexContract(ComplexContract1 input)
23     {
24         return input;
25     }
26
27     [AifCollectionTypeAttribute('return', Types::Class, classStr(Contract1))]
28     public List GetContractList()
29     {
30         List contractList = new List(Types::Class);
31         Contract1 contract = new Contract1();
32         contract.parmStringMember("SomeString");
33         contractList.addEnd(contract);
34         contract = new Contract1();
35         contract.parmStringMember("SomeString2");
36         contractList.addEnd(contract);
37         return contractList;
38     }
39
40     [AifCollectionTypeAttribute('return', Types::Class, classStr(Contract1)),
41         AifCollectionTypeAttribute('input', Types::Class, classStr(Contract1))]
42     public List EchoContractList(List input)
43     {
44         return input;
45     }
46
47 }

因为D365 FO目前(10.0.0.10)还不支持泛型,所以List作为入参和返回值的时候,需要用属性指定List里class的类型,这样通知序列化框架应该用哪个类进行序列化和反序列化。
试了一下,D365 FO(10.0.0.10)的服务方法已经支持返回.NET的类型了,所以在C#里定义一个继承泛型List的类,用来做入参和返回值,这样也就不用List了。
不过正如前文说的,个人不是很喜欢直接返回实体,入参和返回值直接用字符串更直接。
所以我自己封装的话,都会是这样的方法

public str EchoString(str input){return input;}

至于序列化和反序化还是在方法体内进行吧。
2.定义Service
在Project里新增Service,然后关联Class1

 3.新增Service Group,把Service1添加到Service Group

编译程序,服务器端的代码就这么简单。
下一篇blog介绍一下客户端如何调用服务器端方法。

【转】D365 FO第三方集成(三)---服务实现相关推荐

  1. 【转】D365 FO第三方集成(四)---客户端调用

    客户端调用json-based服务非常简单,就是标准的http调用. http调用首先要解决URL的组成,D365 FO json-based调用的url组成如下: https://usnconebo ...

  2. 【转】D365 FO第三方访问https证书问题

    D365FO采用https,第三方通过API调用的时候,客户端不见得信任D365FO的证书,调用时候会报 基础连接已关闭,发送时发生错误,调用堆栈如下: 1 at System.Net.Sockets ...

  3. 第三方推送服务:个推服务推送流程

    一.使用个推服务向手机端推送数据首先需要具备以下条件: 1.个推账号(个推官网注册) 2.由苹果推送证书生成的.p12文件(ANDROID不需要证书) 3.个推SDK(个推官网下载) 二.以上条件具备 ...

  4. 【苹果imessage群发苹果推位置推】软件安装在系统中集成 USBMuxd 服务

    推荐内容IMESSGAE相关 作者推荐内容 iMessage苹果推软件 *** 点击即可查看作者要求内容信息 作者推荐内容 1.家庭推内容 *** 点击即可查看作者要求内容信息 作者推荐内容 2.相册 ...

  5. controller调用controller的方法_SpringCloud Alibaba微服务实战三 - 服务调用

    导读:通过前面两篇文章我们准备好了微服务的基础环境并让accout-service 和 product-service对外提供了增删改查的能力,本篇我们的内容是让order-service作为消费者远 ...

  6. idea/eclipse下Maven工程集成web服务(tomcat、jetty)

     idea/eclipse下Maven工程集成web服务 转载请注明出处:http://www.cnblogs.com/funnyzpc/p/8093554.html 应用服务器最常用的一般有这哥仨: ...

  7. IT数据中心第三方运维服务市场概况

    01 中国IT服务行业市场概况 IT服务是指信息技术服务商为客户提供的贯穿IT系统生命周期的全方位服务,覆盖早期的IT咨询.IT需求定义,中期的IT产品和服务选择.IT项目实施,以及后期的维护升级等一 ...

  8. 小白版的springboot中集成mqtt服务(超级无敌详细),实现不了掐我头!!!

    大家好,我是雄雄,欢迎关注微信公众号雄雄的小课堂 现在是:2023年3月5日19:03:49 前言 在上一篇文章中,我介绍了如何在服务器中安装emqx消息服务器,这是在操作mqtt协议的时候必不可少的 ...

  9. EventBridge 集成云服务实践

    简介:本篇文章主要向大家分享了通过 EventBridge 如何集成云产品事件源,如何集成云产品事件目标以及通过事件流如何集成消息产品. 作者:李凯(凯易) EvenBridge 集成概述 Event ...

最新文章

  1. 【cocos2d-x 手游研发小技巧(3)Android界面分辨率适配方案】
  2. 图论浅析--最短路之Bellman-Ford
  3. Spring Boot系列四 Spring @Value 属性注入使用总结一
  4. 把本地的jar包打包到maven本地仓库里
  5. Grid使用 ComboBox Binding DateTime Format WPF
  6. 调用新浪微博显示用户信息
  7. python pos函数_从0入门Python — 4. 函数
  8. StanfordDB class自学笔记 (8) Querying XML
  9. vim编辑器永久显示行号
  10. 如何在整个目录上运行dos2unix?
  11. 实践四 -- 文本词频分析
  12. 你必须了解的支撑研究蛋白质组学的3大技术
  13. Python三大神器之Virtualenv
  14. 2022年11月编程语言流行度排名
  15. 马云关于计算机的名人名言,马云名人名言
  16. FGPA实现基于cordic算法的反正切函数
  17. 一个模仿途牛旅行应用源码
  18. 【动态规划】图像压缩问题
  19. vscode 修改缩进格数
  20. 既是回文数又是质数c语言,素数回文——输出两整数之间所有既是回文数又是素数的数 C++实现...

热门文章

  1. Linux命令应用大词典-第25章 备份与还原
  2. php开发客服系统(持久连接+轮询+反向ajax)
  3. 【Python笔记】异常处理
  4. android 获取和设置屏幕亮度
  5. 弹出键盘,UIView 上移
  6. 在Windows Azure中使用自己的域名
  7. 在Sql Server 2005使用公用表表达式CTE简化复杂的查询语句
  8. [高效时间管理] 番茄工作钟 windows版本
  9. mysqlnavicat数据库备份与恢复_Navicat如何还原MySQL数据库
  10. nodejs python 通信_Nodejs环境实现socket通信过程解析