最近开发SOA服务调用,写程序的时候服务端采用WCF的TransportWithMessageCredential安全模式,证书为自创建。通关soapUI正常调用,可是通过VS程序在
客户端调用提示:"基础连接已经关闭: 未能为SSL/TLS 安全通道建立信任关系"。 开始以为是服务器端配置问题,后来发现是客户端调用时,发现是在获得请求的时候出错了,由于客户端不信任证书关闭联系所致。 

在调用https service时往往要进行安全连接验证,用正常的方式调用会抛出错误信息 “The remote certificate is invalid according to the validation procedure

此时需要进行强制验证通过

 在网上一顿搜索,发现了一个决绝办法甚是好用,而且很简单,在请求之前添加一行代码。
C#代码 复制代码 收藏代码
  1. ServicePointManager.CertificatePolicy = new AcceptAllCertificatePolicy();  

其中AcceptAllCertificatePolicy需要自己定义:
C#代码 复制代码 收藏代码
  1. internal class AcceptAllCertificatePolicy : ICertificatePolicy   
  2.     {   
  3.         public AcceptAllCertificatePolicy()   
  4.         {   
  5.         }   
  6.   
  7.         public bool CheckValidationResult(ServicePoint sPoint,   
  8.            X509Certificate cert, WebRequest wRequest, int certProb)   
  9.         {   
  10.             // Always accept   
  11.             return true;   
  12.         }   
  13.     }  



以上方法虽然解决了遇到的问题,可是在VS中会提示ServicePointManager.CertificatePolicy已经被否决。由于我是一个喜欢完美的人,于是按照提示使用新的方法来处理。
改造后的代码更加简洁和明了

调用service的代码里加上,然后申明要赋值给委托的方法

C#代码 复制代码 收藏代码
  1. ServicePointManager.ServerCertificateValidationCallback = ValidateServerCertificate;  

C#代码 复制代码 收藏代码
  1. private bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)   
  2.         {   
  3.             return true;   
  4.         }  


就这样了,一个委托搞定!
posted on 2011-03-25 12:04  陈杨(鞍山)  阅读(944)  评论(0)    收藏  举报