项目简介
之前领导布置一个做单点登录的功能给我,实际上就是医院想做一个统一的平台来实现在这个统一的平台登录后不需要在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”,即可领红包。