上次我们结合着项目分析讲解了wcf概述、服务端契约、服务端宿主、服务端配置,这次我们接着讲解(以编程方式实现)客户端配置、数字证书来讲解分析。

客户端配置

我们可以通过添加服务引用来创建客户端应用程序。除了添加引用之外,还可以直接访问包含契约接口的程序集。前面我们不是说了客户端在使用服务时,需要首先创建一个代理服务,然后调用这个代理服务。客户调用代理上的一个方法。代理提供了服务定义的方法,但把方法调用转换为一条消息,并把该消息传输到信道上。信道有一个客户端和一个服务端,它们通过一个网络协议来通信。在信道上,把消息传递给调度程序,调度程序再把消息转换为服务调用的方法调用。所以我们使用ChannelFactory<TChannel>类实例化连接到服务的信道。ChannelFactory<TChannel>类的构造函数接受绑定配置和端点地址这两个参数。绑定参数必须与用服务主机创建的兼容,用EndpointAddress类定义的地址引用所运行的服务的URI

CreateChannel()方法创建一条连接到服务的信道。接着调用服务的方法,可以看出。该服务实例包含状态,直接调用指定了IsTerminating操作行为的Close()方法为止。我们IIS项目中以编程方式创建的客户端如下图所示:

public static object ExecuteMetod<T>(string uri, string methodName, params object[] args)
        {
            //实现WCF密文验证;;
            SystemConfigService sysConfigService = new SystemConfigService();
            SystemConfig systemConfig = sysConfigService.GetOneSystemConfig("WCF", "WCFSecurityCount");
            XmlDocument xmlDocument = new XmlDocument();
            xmlDocument.LoadXml(systemConfig.ParameterValue);
            XmlNode xmlNode = xmlDocument.SelectSingleNode("WCF");
            string WcfUserName = xmlNode.Attributes["WCFUserName"].Value;
            string WcfPsw = xmlNode.Attributes["WCFPsw"].Value;
            WSHttpBinding bind = new WSHttpBinding();
            bind.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
            //实际上 Indentity应该是 对应的cert名称,这里WCFTest只是测试Cert名称
            EndpointIdentity identity = EndpointIdentity.CreateDnsIdentity("IISCompanionWCFCert");
            Uri u = new Uri(uri);
            EndpointAddress endpoint = new EndpointAddress(u, identity);
            ChannelFactory<T> cf = new ChannelFactory<T>(bind, endpoint);
            cf.Credentials.UserName.UserName = WcfUserName;
            cf.Credentials.UserName.Password = WcfPsw;
            T instance = cf.CreateChannel();
            using (instance as IDisposable)
            {
                try
                {
                    Type type = typeof(T);
                    MethodInfo mi = type.GetMethod(methodName);
                    return mi.Invoke(instance, args);
                }
                catch (TimeoutException)
                {
                    (instance as ICommunicationObject).Abort();
                    throw;
                }
                catch (CommunicationException)
                {
                    (instance as ICommunicationObject).Abort();
                    throw;
                }
                catch (Exception)
                {
                    (instance as ICommunicationObject).Abort();
                    throw;
                }
            }
        }


数字证书

为了保证客户端与服务端通信时信息不被窃听篡改,我们iis项目运用了数字证书的安全设定方式,什么是数字证书呢?

据百度百科讲解:数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。最简单的证书包含一个公开密钥、名称以及证书授权中心的数字签名。数字证书是一种权威性的电子文档,由权威公正的第三方机构,即CA(例如GlobalSign,江苏CA)中心签发的证书。它以数字证书为核心的加密技术(加密传输、数字签名、数字信封等安全技术)可以对网络上传输的信息进行加密和解密、数字签名和签名验证,确保网上传递信息的机密性、完整性及交易的不可抵赖性。使用了数字证书,即使您发送的信息在网上被他人截获,甚至您丢失了个人的账户、密码等信息,仍可以保证您的账户、资金安全。

怎样创建我们项目中一样的数字证书呢?主要分为四步如下:

1.将共享盘里SoftwaresWeb组共享》wcf文件夹里的IISCompanionWCFCert.pfx(数字证书)拷贝到桌面;

2.在开始里输入mmc, 会打开控制台,然后点击“文件”选择“添加/删除管理单元”;

3.将列表中的选择“证书”,然后“添加”,然后“确定”,然后选择“计算机账户”,“下一步”,“本地计算机”;

4.点击“证书(本地计算机)”,然后点击“受信任的根证书颁发机构”,右键“证书”,然后“所有任务”,然后“导入”,“下一步”,“浏览”,类型选择“个人信息交换”选择拷贝到桌面的IISCompanionWCFCert.pfx(数字证书);密码为:wcf文件夹里的“说明.txt”里的密码。

总结

对于我们iis项目里的wcf安装经常遇到一些莫名其妙的问题,但总结了下但部分都是这几类问题:

WCF配置文件中的端点ip地址错(IISWindowsService.exe.config);

证书创建不正确;

w3svc服务未安装

防火墙未关闭;

由于每个人的电脑环境不一样所以安装时经常会遇到莫名错误,此时一定要细心耐心查找,一定能找到解决办法的,谢谢观看我的博客!