C#动态调用webService出现 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系。

在远程调用WebService时出现下面的情况:

这种情况一般是由于证书有问题时出现,如果在浏览器中打开是这种情况:

解决方法新建一个类,代码如下:

 1     public static class CertificateTrust
 2     {
 3
 4         public static void SetCertificatePolicy()
 5         {
 6             ServicePointManager.ServerCertificateValidationCallback
 7                        += RemoteCertificateValidate;
 8         }
 9         private static bool RemoteCertificateValidate(
10            object sender, X509Certificate cert,
11             X509Chain chain, SslPolicyErrors error)
12         {
13
14             System.Console.WriteLine("Warning, trust any certificate");
15             return true;
16         }
17     } 

在动态编译WebService的代码中调用上面的类就可以了,注意调用的位置,一定要在打开前调用,下面代码的红色部分

动态编译WebSerivce的代码如下:

 1     public class WSHelper
 2     {
 3         /// < summary>
 4         /// 动态调用web服务
 5         /// < /summary>
 6         /// < param name="url">WSDL服务地址< /param>
 7         /// < param name="methodname">方法名< /param>
 8         /// < param name="args">参数< /param>
 9         /// < returns>< /returns>
10         public static object InvokeWebService(string url, string methodname, object[] args)
11         {
12             return WSHelper.InvokeWebService(url, null, methodname, args);
13         }
14         /// < summary>
15         /// 动态调用web服务
16         /// < /summary>
17         /// < param name="url">WSDL服务地址< /param>
18         /// < param name="classname">类名< /param>
19         /// < param name="methodname">方法名< /param>
20         /// < param name="args">参数< /param>
21         /// < returns>< /returns>
22         public static object InvokeWebService(string url, string classname, string methodname, object[] args)
23         {
24             string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";
25             if ((classname == null) || (classname == ""))
26             {
27                 classname = WSHelper.GetWsClassName(url);
28             }
29             try
30             {   //获取WSDL
31                 WebClient wc = new WebClient();
32
33                 CertificateTrust.SetCertificatePolicy();//证书出现问题时调用此代码
34
35                 Stream stream = wc.OpenRead(url + "?WSDL");
36                 ServiceDescription sd = ServiceDescription.Read(stream);
37                 ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
38                 sdi.AddServiceDescription(sd, "", "");
39                 CodeNamespace cn = new CodeNamespace(@namespace);
40                 //生成客户端代理类代码
41                 CodeCompileUnit ccu = new CodeCompileUnit();
42                 ccu.Namespaces.Add(cn);
43                 sdi.Import(cn, ccu);
44                 CSharpCodeProvider icc = new CSharpCodeProvider();
45                 //设定编译参数添加所需要的DLL文件
46                 CompilerParameters cplist = new CompilerParameters();
47                 cplist.GenerateExecutable = false;
48                 cplist.GenerateInMemory = true;
49                 cplist.ReferencedAssemblies.Add("System.dll");
50                 cplist.ReferencedAssemblies.Add("System.XML.dll");
51                 cplist.ReferencedAssemblies.Add("System.Web.Services.dll");
52                 cplist.ReferencedAssemblies.Add("System.Data.dll");
53                 //编译代理类
54                 CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);
55                 if (true == cr.Errors.HasErrors)
56                 {
57                     System.Text.StringBuilder sb = new System.Text.StringBuilder();
58                     foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors)
59                     {
60                         sb.Append(ce.ToString());
61                         sb.Append(System.Environment.NewLine);
62                     }
63                     throw new Exception(sb.ToString());
64                 }
65                 //生成代理实例,并调用方法
66                 System.Reflection.Assembly assembly = cr.CompiledAssembly;
67                 Type t = assembly.GetType(@namespace + "." + classname, true, true);
68                 object obj = Activator.CreateInstance(t);
69                 System.Reflection.MethodInfo mi = t.GetMethod(methodname);
70                 return mi.Invoke(obj, args);
71             }
72             catch (Exception ex)
73             {
74                 throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
75             }
76         }
77         private static string GetWsClassName(string wsUrl)
78         {
79             string[] parts = wsUrl.Split(‘/‘);
80             string[] pps = parts[parts.Length - 1].Split(‘.‘);
81             return pps[0];
82         }
83     }

调用动态编译的代码如下:

1                 string url = "http://localhost:81/WebServiceLogin.asmx";
2                 string[] args = new string[2];
3                 args[0] = "参数1";
4                 args[1] = "参数2";
5                 object result = WSHelper.InvokeWebService(url, "HelloWorld", args);

时间: 2024-10-06 10:27:29

C#动态调用webService出现 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系。的相关文章

https调用出现【基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系】错误

今天不知道为什么网站访问就出现问题了,惊得我一头汗,别是我昨天打了log4,就影响今天的内容了,后来发现,确实不是,是写入流失败了,报[基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系]错误,后来让总线查,他们说是自己的接口链接证书失效了,正在补救. 病急乱投医中网上查到解决方法:重写通信通道连接验证回调 直接上代码: 1 先加入命名空间: 2 3 using System.Net.Security; 4 using System.Security.Authentication;

解决Error"基础连接已经关闭: 未能为SSL/TLS 安全通道建立信任关系

今天写程序的时候调用到一个第三方的DLL文件,本机调试一切都正常,但是程序不是到服务器以后一直提示一个BUG:"基础连接已经关闭: 未能为SSL/TLS 安全通道建立信任关系". 后来把DLL文件进行反编译,发现是在获得请求的时候出错了. 引用 WebResponse response = WebRequest.Create("https://--").GetResponse(); 于是在服务器上用浏览器打开上面的地址,发现会弹出一个确认证书的窗口,看来是证书问题.

C# 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系。

今天写程序的时候调用到一个第三方的DLL文件,本机调试一切都正常,但是程序不是到服务器以后一直提示一个BUG:"基础连接已经关闭: 未能为SSL/TLS 安全通道建立信任关系". 后来把DLL文件进行反编译,发现是在获得请求的时候出错了. 引用 WebResponse response = WebRequest.Create("https://……").GetResponse(); 定义一个类,来对远程X.509证书的验证,进行处理,返回为true.我们要自己定义一

System.Net.WebException: 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系。 ---&gt; System.Security.Authentication.AuthenticationException: 根据验证过程,远程证书无效。

今天写程序的时候调用到一个第三方提供的https地址,访问此地址去获取加密的json格式数据,出现BUG c#报错 :  System.Net.WebException: 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系. ---> System.Security.Authentication.AuthenticationException: 根据验证过程,远程证书无效. 引用: private string callbackRefund(string url, string d

基础连接已经关闭: 未能为SSL/TLS 安全通道建立信任关系

#region private static bool ValidateServerCertificate 解决Error"基础连接已经关闭: 未能为SSL/TLS 安全通道建立信任关系." /// <summary> /// 解决Error"基础连接已经关闭: 未能为SSL/TLS 安全通道建立信任关系." /// </summary> /// <param name="sender"></param&

基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系

//1. ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true; //2. ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback ( delegate { return true; } )

[转][C#]基础连接已经关闭 未能为 SSL/TLS 安全通道建立信任关系

来自:https://www.cnblogs.com/waw/p/8286608.html 代码部分: static TestApplication(){ ServicePointManager.ServerCertificateValidationCallback += RemoteCertificateValidate; } private static bool RemoteCertificateValidate(object sender, X509Certificate cert, X

C#模拟Http请求时出现 基础连接已经关闭 未能为 SSLTLS 安全通道建立信任关系

//解决方法: //引入命名空间: using System.Security.Cryptography.X509Certificates; using System.Net.Security; //定义方法: private static bool RemoteCertificateValidate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error) { //为了通过证书验证,总是返回true

post请求远程url 报错“基础连接已经关闭...Authentication.AuthenticationException...远程证书无效”解决方案

当我们有时用代码编写post请求url远程地址会报“基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系. ---> System.Security.Authentication.AuthenticationException: 根据验证过程,远程证书无效.”这个异常,是因为远程url使用的域名 没有购买证书,所以用以下方式来解决: ps:在create url之前 设定“获取或设置用于验证服务器证书的回调”永远为true 即可,具体如下 post请求一定需要:System.Net.