一般情况下调用远程WebService通过代理类直接访问就可以,可是如果WebService是在https站点下,调用时就要分情况考虑了,整理了一下:

 

1、客户端证书已正确安装

指已经在客户端安装了客户端证书到证书存储区,且证书符合以下几个条件:

  ◆ 证书中定义的使用者与访问WebService时使用的域名一致;
  ◆ 证书未过期;
  ◆ 证书链在本机完整可信;

关于证书链完整可信,是指本证书,以及向上追溯的各级颁发者,直至根证书颁发者,都被系统承认。

此时直接调用即可,与访问http时没有区别,底层会自动处理SSL握手。如果有任何一项不符合要求,调用时就会产生“基础连接已经关闭:未能为 SSL/TLS 安全通道建立信任关系”的异常,此时要使用2中的方法。

2、客户端证书未正确安装

  1. public void CallRemoteWebService()  
  2.     //指定证书验证回调方法,Lamda表达式,直接返回true,表示忽略所有错误  
  3.     ServicePointManager.ServerCertificateValidationCallback = (source, cert, chain, errors) => true
  4.   
  5.     //创建WebService的代理实例  
  6.     var proxy = new Proxy();  
  7.     //远程调用  
  8.     proxy.DoSomething();  
  9. }  

关键在于要让证书验证时忽略所有错误。不用担心,忽略错误只是指不用判断证书有效性,并不会影响通信信道的加密过程。