工作笔记 | Visual Studio 调用 Web Service
引言
最近笔者负责ERP财务系统跟中粮集团财务公司的财务系统做对接,鉴于ERP系统中应付结算单结算量比较大,而且管理相对集中,ERP系统与中粮财务公司的支付平台系统对接,实现银企直联,将网银录入的环节、付款以后ERP确认环节自动化,节省人工操作环节带来的误差。
这样公司财务人员在我们的系统中做对外的付款单,自动向集团财务系统发起付款指令,由集团统一通过银行给对应的供应商转账,并监控付款单的状态,完成供应商在系统的正常结算。
系统对接环境
业务层面不再多述,本文主要介绍技术层面实施:
- 集团财务公司提供的是基于SAP架构的Web Service接口
- ERP开发环境使用VS2013
- 访问模式是半双工,我们ERP系统单向远程调用接口,发起付款指令、并轮询付款单状态
自VS2008以后,为了对.NET Framework 3.0 或 3.5版本上WCF Service Library的支持。增加了Add Service Reference(添加服务引用)功能,这样可以在VS中很方便的添加Web Service接口引用,并通过简单的配置,调用远程服务。
申请开通集团通道白名单
一般来说不可以随便访问集团SAP,必须找运维人员开通访问权限。开通后,通过telnet查看ip地址和端口是否已经开放,或者浏览器访问,正常的话应该如下图:
项目中添加服务引用
选中项目,右键 -> 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帮我们做了什么
为了更好的学习,我们深入了解一下,VS帮我们都做了哪些工作。
项目新建的Service References目录下的服务,在VS中是无法查看的,我们可以进入对应的目录下,看看都生成了哪些文件:
首先可以看到,目录下有个wsdl文件,大家应该都熟悉,这是用来定义和描述Web Service的,通过这个文件,就可以知道接口都提供了哪些方法,输入参数类型和输出结果格式。打开这个wsdl文件看一下,跟我们想象的一样,原来,VS在引用服务访问远程wsdl文件的同时,在本地拷贝了一份。
接下来我们看一个后缀为 .cs 重要的文件,打开看下,这里面,VS帮我们生成了关于这个服务的接口和实现类。
这里最重要的,是帮我们生成了 SOS_TxService_SendClient 这个类,研究一下,发现已经实现了之前看到的Send、Send1两个方法,并提供了对应的异步方法。
我们整理一下VS做的工作:
- 添加服务引用时,访问远程 wsdl 文件,并拷贝本地;
- 根据 wsdl 文件中的接口定义,定义调用端接口(比如Send,Send1);
- 定义代理服务 SendClient 类,继承上述定义的调用端接口,并提供具体实现(实现Send,Send1);
- 定义和实现其他辅助类,比如 SendRequest,SendResponse;
- 生成 app.config 中相关配置;
到这里,聪明的你可能要问,既然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依旧报错,大家有兴趣可以自己研究一下。
工作笔记 | Visual Studio 调用 Web Service的更多相关文章
- VB.NET,C#.NET调用Web Service,利用visual studio 的实现方法
下面是一篇文章比较详细,其实具体操作很简单,把Web Service服务地址,利用工具(VS2010),通过添加引用的形式,添加到项目中来就可以应用了. 大家如果这个地方不会操场的话,可以问问我QQ: ...
- Dynamic CRM 2013学习笔记(二十五)JS调用web service 实现多条记录复制(克隆)功能
前面介绍过如何克隆一条当前的记录: Dynamic CRM 2013学习笔记(十四)复制/克隆记录 , 主要是通过界面上加一个字段,单击form上的clone 按钮时,改变这个字段的值以触发插件来实现 ...
- C#开发和调用Web Service
http://blog.csdn.net/h0322/article/details/4776819 1.1.Web Service基本概念 Web Service也叫XML Web Service ...
- ASP.NET调用Web Service
1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求, ...
- C# 调用 Web Service
Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术.是:通过SOAP ...
- [Teamcenter 2007 开发实战] 调用web service
前言 在TC的服务端开发中, 能够使用gsoap 来调用web service. 怎样使用 gsoap , 參考 gsoap 实现 C/C++ 调用web service 接下来介绍怎样在TC中进行 ...
- VSS提示"Could not find the Visual SourceSafe Internet Web Service connection information for the specified database
转自:http://www.cnblogs.com/qqflying/archive/2007/12/18/1004051.html VSS连接错误提示: ====================== ...
- php5调用web service
工作中需要用php调用web service接口,对php不熟,上网搜搜,发现关于用php调用web service的文章也不多,不少还是php4里用nusoap这个模块调用的方法,其实php5里已经 ...
- php5调用web service (笔者测试成功)
转自:http://www.cnblogs.com/smallmuda/archive/2010/10/12/1848700.html 感谢作者分享 工作中需要用php调用web service接口, ...
随机推荐
- web前端加载优化-减少HTTP请求 (细节与办法)
减少HTTP请求. 因为手机浏览器同时响应请求为4个请求(Android支持4个,iOS 5后可支持6个),所以要尽量减少页面的请求数,首次加载同时请求数不能超过4个.a) 合并CSS.JavaScr ...
- C语言第四次博客作业--嵌套循环
一.PTA实验作业 题目1:编程打印空心字符菱形 1. 本题PTA提交列表 2. 设计思路(流程图) 3.本题调试过程碰到问题及解决办法 思考过程:将问题拆解为菱形问题和字母变化问题两部分 1> ...
- 设计模式之观察者(OBSERVER)模式
定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. Observer模式描述了如何建立这种关系.这一模式中的关键对象是目标(subject ...
- 【Django】 视图层说明
[Django视图层] 视图层的主要工作是衔接HTTP请求,Python程序和HTML模板,使他们能够有机互相合作从模型层lou到数据并且反馈.说到视图层的工作就有以下几个方面要说 ■ URL映射 对 ...
- iOS CocoaPods一些特别的用法 指定版本、版本介绍、忽略警告
简介 介绍一些CocoaPods一些特别的用法 CocoaPods github地址 CocoaPods 官方地址 1. 指定第三方库版本 1. 固定版本 target 'MyApp' do use_ ...
- machine learning 之 多元线性回归
整理自Andrew Ng的machine learning课程 week2. 目录: 多元线性回归 Multivariates linear regression /MLR Gradient desc ...
- "机器人防火墙":人机识别在应用安全及风控领域的一点实践
美剧 WestWorld 第二集里有个场景十分有意思:游客来到西部世界公园,遇到了一个漂亮的女接待员,但无法区分对方是否是人类,于是产生了如下对话: Guest: "Are you real ...
- 201621123040《Java程序设计》第十一周学习总结
1.本周学习总结 1.1以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2.书面作业 2.1源代码阅读:多线程程序BounceThread 2.1.1BallRunnable类有什么用?为什 ...
- 201621123040《Java程序设计》第七周学习总结
1.本周学习总结 1.1思维导图:Java图形界面总结 2.书面作业 2.1GUI中的事件处理 2.1.1写出事件处理模型中最重要的几个关键词. 关键词:事件 事件源 事件监听器 2.1.2任意编写事 ...
- Beta版本敏捷冲刺每日报告——Day4
1.情况简述 Beta阶段第四次Scrum Meeting 敏捷开发起止时间 2017.11.5 08:00 -- 2017.11.5 22:00 讨论时间地点 2017.11.5晚9:00,软工所实 ...