C# 调用WCF服务的两种方法
项目简介
之前领导布置一个做单点登录的功能给我,实际上就是医院想做一个统一的平台来实现在这个统一的平台登录后不需要在His、Emr、Lis等系统一个个登录,直接可以登录到对应的系统,然后进行相应的操作,方便医护人员的日常操作。具体到我们His开发商来说就是实现一个登录是调用第三方WCF接口获取第三方登录用户在His登录的用户名、密码后续可能还会包括CA信息。
之前有自己写过WCF服务给第三方调用,调用过第三方Http服务,还没有写过调用WCF服务的任务。自己写过WCF服务的经验加上网上查阅的资料,分别使用两种方法来实现C#调用WCF服务:1、直接添加服务引用;2、使用Vs 自带 SvcUtil工具生成服务代理类。使用的编辑器是VS2008,不同版本之前存在差异。
直接添加服务引用
第一步、在解决方案项目右键,选择添加服务引用。
第二步、书写需要实现的功能,针对这个项目就是调用服务的方法,按要求传入Json格式参数获取并解析返回的Json格式出参,然后利用出参去实现自己需要实现的功能。
完成上一步以后,就可以开始书写代码来实现自己需要实现的功能了,实际上添加服务引用的使用,VS会自动替你在添加服务引用的解决方案项目对应的配置文件app.config添加服务绑定、终结点等配置信息。如果你在添加服务引用的项目下面书写实现功能部分的代码,则不需要管配置文件,如果你的启动项目不是添加服务引用的项目,那么你需要在启动项目的配置文件部分增加VS编辑器自动添加的配置文件内容,我把自动生成部分的内容展示给大家看看,因为这是我实际开发环境下引用的项目,所以我会对路径部分进行处理,端口号是可选的,有的服务使用的默认端口号。针对服务绑定、终结点可以参考博客:https://blog.csdn.net/zhang_xinxiu/article/details/41329511
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_ISSOService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://路径[:端口号]/SSOService.svc"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ISSOService"
contract="SSOService.ISSOService" name="BasicHttpBinding_ISSOService" />
</client>
</system.serviceModel>
public class SingleSignOnParam
{
public static SingleSignOnOut GetSingleSignOnOut()
{
//实例化服务客户端对象
SSOServiceClient client = new SSOServiceClient();
//Json序列化对象实例
JavaScriptSerializer serializer = new JavaScriptSerializer();
//获取机器Mac地址
string StrMac = DbTool.GetMac();
//构建入参对象
SingleSignOnIn singleSignIn = new SingleSignOnIn() { appid = "34", keyword = StrMac.Replace("-","") };
string jsonStr = string.Empty;
//序列化得到Json格式入参字符串
jsonStr = serializer.Serialize(singleSignIn);
//调用服务方法得到出参字符串
string StrOut = client.GetDataExchange(jsonStr);
try
{
//解析出参字符串得到实例
JsonOutPara para = serializer.Deserialize<JsonOutPara>(StrOut);
if(para.Code=="1")
//需要使用的信息存储在JsonOutPara对象的Result字段中,对字段内的Json格式字符串再次进行解析
return serializer.Deserialize<SingleSignOnOut>(para.Result);
}
catch (Exception)
{
throw;
}
return null;
}
}
public class SingleSignOnIn
{
public string appid { get; set; }
public string keyword { get; set; }
}
public class JsonOutPara
{
public string Code { get; set; }
public string Message { get; set; }
public string Result { get; set; }
}
public class SingleSignOnOut
{
public string menuid { get; set; }
public string menuname { get; set; }
public string appid { get; set; }
public string appname { get; set; }
public string apptype { get; set; }
}
我对代码进行了简单的注释,不明白的地方可以回复我,然后进行沟通。这里面主要是入参和出参都是Json格式的字符串,我这里使用.Net自带的System.Web.Extensions程序集,在使用时需先在项目上添加引用然后在代码前面添加命名空间,代码如下:using System.Web.Script.Serialization;对于Json转换为对象详细可以参考博客园文章 https://www.cnblogs.com/zxtceq/p/6610214.html,文章中还给出一个转换Json字符串给C#类的工具,我觉得非常棒。
生成代理类
生成代理类的方式相对于第一种方式具有一定的优势:不需要添加服务引用,但是配置文件的内容还是需要添加的,但一旦服务有所更新,就必须重新生成新的代理类并进行替换,我这里使用Vs2008自带的SvcUtil工具,启动程序后输入命令: svcutil.exe http://路径[:端口]/SSOService.svc?wsdl
接下来在对应的目录下面找到代理类文件和配置文件,将配置文件的内容粘贴到实际启动的项目的配置文件中。我在单独一个程序里面进行了该方法的测试,实际效果跟直接添加服务引用一致。打开支付宝首页搜索“524252978”,即可领红包。
参考资料:
https://www.cnblogs.com/pnljs/p/3765892.html
https://www.cnblogs.com/zxtceq/p/6610214.html
C# 调用WCF服务的两种方法的更多相关文章
- 学习之路十四:客户端调用WCF服务的几种方法小议
最近项目中接触了一点WCF的知识,也就是怎么调用WCF服务,上网查了一些资料,很快就搞出来,可是不符合头的要求,主要有以下几个方面: ①WCF的地址会变动,地址虽变,但是里面的逻辑不变! ②不要引用W ...
- 调用WCF服务的几种方式
首先发布了一个名为PersonService的WCF服务.服务契约如下: [ServiceContract] public interface IPersonService { ...
- C#动态调用WCF接口,两种方式任你选。
写在前面 接触WCF还是它在最初诞生之处,一个分布式应用的巨作. 从开始接触到现在断断续续,真正使用的项目少之又少,更谈不上深入WCF内部实现机制和原理去研究,最近自己做一个项目时用到了WCF. 从这 ...
- java中调用dll文件的两种方法
一中是用JNA方法,另外是用JNative方法,两种都是转载来的, JNA地址:http://blog.csdn.net/shendl/article/details/3589676 JNativ ...
- awk调用shell命令的两种方法:system与print
from:http://www.oklinux.cn/html/developer/shell/20070626/31550.htmlawk中使用的shell命令,有2种方法: 一.使用所以syste ...
- vs2019 实现C#调用c++的dll两种方法
1.托管与非托管的区别 2.非托管类的实现 第一步:创建C++空项目(命名Caculate)添加一个类AddOperate 第二步:将C++代码编译成动态库dll 第三步:将dll拷贝到c#项目输入目 ...
- DEDECMS5.5/5.6/5.7列表页调用TAG标签(热门标签)的两种方法
DEDECMS5.5/5.6/5.7列表页调用TAG标签的两种方法: 一.DedeCMSv5.6及其以前版本: dedecms默认在列表是无法调用tag标签的,经过各位版主们的帮助,现给大家提供出2种 ...
- Hive开发中使用变量的两种方法
在使用hive开发数据分析代码时,经常会遇到需要改变运行参数的情况,比如select语句中对日期字段值的设定,可能不同时间想要看不同日期的数据,这就需要能动态改变日期的值.如果开发量较大.参数多的话, ...
- 实现jquery.ajax及原生的XMLHttpRequest调用WCF服务的方法
废话不多说,直接讲解实现步骤 一.首先我们需定义支持WEB HTTP方法调用的WCF服务契约及实现服务契约类(重点关注各attribute),代码如下: //IAddService.cs namesp ...
随机推荐
- Irrelevant Elements UVA-1635 (二项式定理)
vjudge链接 原题链接 乍一看似乎没什么思路,但是写几个简单的例子之后规律就变得很明显. 比如当 n=5 时,每一步计算后的结果如下: a1 a1+a2 a1+2a2+a3 a1+3a2+3a3+ ...
- scanf 函数笔记
函数声明 int scanf(const char *format, ...); 说明 <返回值> scanf ("<格式化字符串>", <参数表&g ...
- React的环境搭建以及脚手架的安装
1.安装node.js 如果安装了,就请参照第二步:没有的话,去node.js官网下载:https://nodejs.org/zh-cn/download/ 2.检查 win键+r -----> ...
- Day3-Python3基础-函数
本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 1.函数的定义 定义: 函数是指将一组语句的集 ...
- wireshark简单实用教程
转自:https://jingyan.baidu.com/article/c35dbcb0866b698916fcbc81.html wireshark是非常流行的网络封包分析软件,功能十分强大.可以 ...
- ios--->帧动画
帧动画 NSMutableArray<UIImage *> *imageArr=[NSMutableArray array]; for(int i=0;i<20;i++){ NSSt ...
- vue-父组件向子组件传值
一.父组件向子组件传值 其实该问题是说子组件如何访问父组件的属性和方法?那么根据对组件化的理解,无非就是要解决两个问题: 1.父组件如何将值传给子组件? 2.子组件如何获取父组件传递过来的值? 解读v ...
- MySQL物理物理备份与还原工具xtraBackup
(一)xtraBackup简介 xtraBackup是Percona公司开发的一款MySQL数据库备份软件,在备份模式中属于物理备份.其显著特点是开源.免费.备份执行过程中不会阻塞事物.备份可压缩.支 ...
- django登录页面优化
环境准备 1.python3.6 2.django2.0+ 3.bootstrap3 后台代码 #创建login_check视图函数,用来处理登录 def login_action(request): ...
- MybatisDao
一.mybatisDao的编写(原始方式,不用) 1.接口编写 public interface UserDao { public void save(User user); public User ...