最近笔者负责ERP财务系统跟中粮集团财务公司的财务系统作对接,鉴于ERP系统中应付结算单结算量比较大,并且管理相对集中,ERP系统与中粮财务公司的支付平台系统对接,实现银企直联,将网银录入的环节、付款之后ERP确认环节自动化,节省人工操做环节带来的偏差。
这样公司财务人员在咱们的系统中作对外的付款单,自动向集团财务系统发起付款指令,由集团统一经过银行给对应的供应商转帐,并监控付款单的状态,完成供应商在系统的正常结算。浏览器
业务层面再也不多述,本文主要介绍技术层面实施:网络
自VS2008之后,为了对.NET Framework 3.0 或 3.5版本上WCF Service Library的支持。增长了Add Service Reference(添加服务引用)功能,这样能够在VS中很方便的添加Web Service接口引用,并经过简单的配置,调用远程服务。架构
通常来讲不能够随便访问集团SAP,必须找运维人员开通访问权限。开通后,经过telnet查看ip地址和端口是否已经开放,或者浏览器访问,正常的话应该以下图:
app
选中项目,右键 -> Add -> Service Reference
弹出的界面中,Address输入提供的Web Service地址,而后点击 GO 按钮,这里通常会提示输入用户名和密码,输入后能够看到Web Service引用连通。展开服务,能够看到接口提供了2个方法。若是这一步提示错误,能够在浏览器中输入地址,看看是否能访问,其实就是访问远程的wsdl文件,若是访问不了,再检查是不是网络或者权限的缘由。
咱们点“肯定”,能够看到VS自动帮咱们在项目目录下生成了一个文件夹:Service References,里面有刚才看到的服务名,同时会在 app.config 中增长一段配置相似以下(若是当前没有app.config文件,会自动生成):运维
<system.serviceModel> <client> <endpoint address="http://xx.xx.xxx.xx:50000/xxxxxxx" binding="basicHttpBinding" bindingConfiguration="SOS_TxService_SendBinding" contract="TxService.SOS_TxService_Send" name="HTTP_Port" /> </client> </system.serviceModel>
为了更好的学习,咱们深刻了解一下,VS帮咱们都作了哪些工做。
项目新建的Service References目录下的服务,在VS中是没法查看的,咱们能够进入对应的目录下,看看都生成了哪些文件:
首先能够看到,目录下有个wsdl文件,你们应该都熟悉,这是用来定义和描述Web Service的,经过这个文件,就能够知道接口都提供了哪些方法,输入参数类型和输出结果格式。打开这个wsdl文件看一下,跟咱们想象的同样,原来,VS在引用服务访问远程wsdl文件的同时,在本地拷贝了一份。
接下来咱们看一个后缀为 .cs 重要的文件,打开看下,这里面,VS帮咱们生成了关于这个服务的接口和实现类。
这里最重要的,是帮咱们生成了 SOS_TxService_SendClient 这个类,研究一下,发现已经实现了以前看到的Send、Send1两个方法,并提供了对应的异步方法。
咱们整理一下VS作的工做:异步
到这里,聪明的你可能要问,既然VS已经帮咱们生成了代理服务类 SendClient,并且类已经提供了接口方法的具体实现,如今是否是直接实例化一个服务类,直接调用方法就能够远程调用?是的,没错!VS基本把须要作的工做都帮你作了,剩下的就是使用就好了,简单吧。工具
通常状况下,咱们访问Web Service,须要提供用户名和密码的权限认证,不然直接调用的话,会报错。
这里咱们修改一下 app.config 文件以下:单元测试
<system.serviceModel> <bindings> <basicHttpBinding> <binding name="SOS_TxService_SendBinding" > <security mode="TransportCredentialOnly" > <transport clientCredentialType="Basic"/> <message clientCredentialType="UserName"/> </security> </binding> </basicHttpBinding> </bindings> <client> <endpoint address="http://xx.xx.xxx.xx:50000/xxxxxxx" binding="basicHttpBinding" bindingConfiguration="SOS_TxService_SendBinding" contract="TxService.SOS_TxService_Send" name="HTTP_Port" /> </client> </system.serviceModel>
单元测试调用一下,能够看到能正常返回 xml 格式的结果:学习
[TestMethod] public void WebServiceTest() { var client = new SOS_TxService_SendClient(); if (client.ClientCredentials != null) { client.ClientCredentials.UserName.UserName = "username"; client.ClientCredentials.UserName.Password = "password"; try { var tt = client.Send("test"); Assert.IsTrue(tt.Length > 0); } catch (Exception e) { Console.WriteLine(e); throw; } } }
还有一个问题,就是跨项目引用,好比在一个基础服务项目中,实现了远程调用。在应用层项目中,引用了基础服务项目dll,应该注意如下一点:选中生成的服务,右键-> Configure Service Reference:
保证相关的程序集可以正常引用,而后在应用层项目,并手动将 app.config 的相关配置拷贝至项目目录下。测试
至此,咱们经过VS调用 Web Service 实施成功,仍是比较简单,其实没有什么技术难点,主要但愿能深刻了解原理,知道VS后台自动帮助咱们作了哪些工做,若是咱们不使用辅助工具的时候,要实现远程访问,应该怎么去实现。 注:目前 .net core 环境对 Web Service 支持不是很好,笔者在VS2017中,.net core 引用 Web Service依旧报错,你们有兴趣能够本身研究一下。