项目简介

之前领导布置一个做单点登录的功能给我,实际上就是医院想做一个统一的平台来实现在这个统一的平台登录后不需要在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服务的两种方法的更多相关文章

  1. 学习之路十四:客户端调用WCF服务的几种方法小议

    最近项目中接触了一点WCF的知识,也就是怎么调用WCF服务,上网查了一些资料,很快就搞出来,可是不符合头的要求,主要有以下几个方面: ①WCF的地址会变动,地址虽变,但是里面的逻辑不变! ②不要引用W ...

  2. 调用WCF服务的几种方式

    首先发布了一个名为PersonService的WCF服务.服务契约如下: [ServiceContract]     public interface IPersonService     {     ...

  3. C#动态调用WCF接口,两种方式任你选。

    写在前面 接触WCF还是它在最初诞生之处,一个分布式应用的巨作. 从开始接触到现在断断续续,真正使用的项目少之又少,更谈不上深入WCF内部实现机制和原理去研究,最近自己做一个项目时用到了WCF. 从这 ...

  4. java中调用dll文件的两种方法

    一中是用JNA方法,另外是用JNative方法,两种都是转载来的, JNA地址:http://blog.csdn.net/shendl/article/details/3589676   JNativ ...

  5. awk调用shell命令的两种方法:system与print

    from:http://www.oklinux.cn/html/developer/shell/20070626/31550.htmlawk中使用的shell命令,有2种方法: 一.使用所以syste ...

  6. vs2019 实现C#调用c++的dll两种方法

    1.托管与非托管的区别 2.非托管类的实现 第一步:创建C++空项目(命名Caculate)添加一个类AddOperate 第二步:将C++代码编译成动态库dll 第三步:将dll拷贝到c#项目输入目 ...

  7. DEDECMS5.5/5.6/5.7列表页调用TAG标签(热门标签)的两种方法

    DEDECMS5.5/5.6/5.7列表页调用TAG标签的两种方法: 一.DedeCMSv5.6及其以前版本: dedecms默认在列表是无法调用tag标签的,经过各位版主们的帮助,现给大家提供出2种 ...

  8. Hive开发中使用变量的两种方法

    在使用hive开发数据分析代码时,经常会遇到需要改变运行参数的情况,比如select语句中对日期字段值的设定,可能不同时间想要看不同日期的数据,这就需要能动态改变日期的值.如果开发量较大.参数多的话, ...

  9. 实现jquery.ajax及原生的XMLHttpRequest调用WCF服务的方法

    废话不多说,直接讲解实现步骤 一.首先我们需定义支持WEB HTTP方法调用的WCF服务契约及实现服务契约类(重点关注各attribute),代码如下: //IAddService.cs namesp ...

随机推荐

  1. ffplay的使用

    https://www.cnblogs.com/renhui/p/8458802.html

  2. Spring中的BeanPostProcessor详解

    Spring中的BeanPostProcessor详解 概述 BeanPostProcessor也称为Bean后置处理器,它是Spring中定义的接口,在Spring容器的创建过程中(具体为Bean初 ...

  3. php--->查询超大文件(12G)

    今天遇到一个要在一个12G日志中查询数据的需求,手中暂时没有查询这种超大文件的工具,于是自己写了一个程度来读这个超大文件 其整体思路就是一行一行地去读取超大文件中的数据,然后将拿出的一行数据做相应的查 ...

  4. jdk8中CompletableFuture的各个API用法,极大扩展了Future

    就不介绍了,直接贴代码,建议在代码中使用,真的很方便 package cn.hou.completablefuture; import org.junit.Test; import java.util ...

  5. 透过现象看webpack处理css文件中图片路径转换的具体过程

    webpack是目前使用比较流行的一个前端模块打包器,前端的任何资源都被当成一个模块来处理,如图片.css文件等等.在基于webpack构建的前端项目中,一般都会配置有关css文件处理的规则,这其中也 ...

  6. Leetcode | 刷题日记(1)

    本文记录个人刷题记录 推荐两个刷题网站: 地址:https://leetcode.com/ 另外一个地址:http://www.lintcode.com/ 1.Write a SQL query to ...

  7. Linux防火墙之iptables常用扩展匹配条件(一)

    上一篇博文讲了iptables的基本匹配条件和隐式匹配条件,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12269717.html:今天在来说说iptabel ...

  8. 在jsp页面下, 让eclipse完全支持HTML/JS/CSS智能提示

    我们平时用eclipse开发jsp页面时智能提示效果不太理想,今天用了两个小时发现了eclipse也可以像Visual Studio 2008那样完全智能提示HTML/JS/CSS代码,使用eclip ...

  9. Codeforces_712_A

    http://codeforces.com/contest/712/problem/A 水题,写出来就看到规律了. #include<iostream> #include<cstri ...

  10. ARTS Week 2

    Nov 4,2019 ~ Nov 10,2019 Algorithm 本周主要的算法是如何求两个数的最大公因数.传统的想法便是对这两个数分解质因数,而后找到其公共因数,再相乘,这样就会得到最大公因数了 ...