【转】D365 FO第三方集成(三)---服务实现
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第三方集成(三)---服务实现相关推荐
- 【转】D365 FO第三方集成(四)---客户端调用
客户端调用json-based服务非常简单,就是标准的http调用. http调用首先要解决URL的组成,D365 FO json-based调用的url组成如下: https://usnconebo ...
- 【转】D365 FO第三方访问https证书问题
D365FO采用https,第三方通过API调用的时候,客户端不见得信任D365FO的证书,调用时候会报 基础连接已关闭,发送时发生错误,调用堆栈如下: 1 at System.Net.Sockets ...
- 第三方推送服务:个推服务推送流程
一.使用个推服务向手机端推送数据首先需要具备以下条件: 1.个推账号(个推官网注册) 2.由苹果推送证书生成的.p12文件(ANDROID不需要证书) 3.个推SDK(个推官网下载) 二.以上条件具备 ...
- 【苹果imessage群发苹果推位置推】软件安装在系统中集成 USBMuxd 服务
推荐内容IMESSGAE相关 作者推荐内容 iMessage苹果推软件 *** 点击即可查看作者要求内容信息 作者推荐内容 1.家庭推内容 *** 点击即可查看作者要求内容信息 作者推荐内容 2.相册 ...
- controller调用controller的方法_SpringCloud Alibaba微服务实战三 - 服务调用
导读:通过前面两篇文章我们准备好了微服务的基础环境并让accout-service 和 product-service对外提供了增删改查的能力,本篇我们的内容是让order-service作为消费者远 ...
- idea/eclipse下Maven工程集成web服务(tomcat、jetty)
idea/eclipse下Maven工程集成web服务 转载请注明出处:http://www.cnblogs.com/funnyzpc/p/8093554.html 应用服务器最常用的一般有这哥仨: ...
- IT数据中心第三方运维服务市场概况
01 中国IT服务行业市场概况 IT服务是指信息技术服务商为客户提供的贯穿IT系统生命周期的全方位服务,覆盖早期的IT咨询.IT需求定义,中期的IT产品和服务选择.IT项目实施,以及后期的维护升级等一 ...
- 小白版的springboot中集成mqtt服务(超级无敌详细),实现不了掐我头!!!
大家好,我是雄雄,欢迎关注微信公众号雄雄的小课堂 现在是:2023年3月5日19:03:49 前言 在上一篇文章中,我介绍了如何在服务器中安装emqx消息服务器,这是在操作mqtt协议的时候必不可少的 ...
- EventBridge 集成云服务实践
简介:本篇文章主要向大家分享了通过 EventBridge 如何集成云产品事件源,如何集成云产品事件目标以及通过事件流如何集成消息产品. 作者:李凯(凯易) EvenBridge 集成概述 Event ...
最新文章
- 【cocos2d-x 手游研发小技巧(3)Android界面分辨率适配方案】
- 图论浅析--最短路之Bellman-Ford
- Spring Boot系列四 Spring @Value 属性注入使用总结一
- 把本地的jar包打包到maven本地仓库里
- Grid使用 ComboBox Binding DateTime Format WPF
- 调用新浪微博显示用户信息
- python pos函数_从0入门Python — 4. 函数
- StanfordDB class自学笔记 (8) Querying XML
- vim编辑器永久显示行号
- 如何在整个目录上运行dos2unix?
- 实践四 -- 文本词频分析
- 你必须了解的支撑研究蛋白质组学的3大技术
- Python三大神器之Virtualenv
- 2022年11月编程语言流行度排名
- 马云关于计算机的名人名言,马云名人名言
- FGPA实现基于cordic算法的反正切函数
- 一个模仿途牛旅行应用源码
- 【动态规划】图像压缩问题
- vscode 修改缩进格数
- 既是回文数又是质数c语言,素数回文——输出两整数之间所有既是回文数又是素数的数 C++实现...
热门文章
- Linux命令应用大词典-第25章 备份与还原
- php开发客服系统(持久连接+轮询+反向ajax)
- 【Python笔记】异常处理
- android 获取和设置屏幕亮度
- 弹出键盘,UIView 上移
- 在Windows Azure中使用自己的域名
- 在Sql Server 2005使用公用表表达式CTE简化复杂的查询语句
- [高效时间管理] 番茄工作钟 windows版本
- mysqlnavicat数据库备份与恢复_Navicat如何还原MySQL数据库
- nodejs python 通信_Nodejs环境实现socket通信过程解析