System.Net.WebException: 未能解析此远程名称‘api.weixin.qq.com‘

        在服务器上调用第三方接口,出现异常报错"System.Net.WebException: 未能解析此远程名称: 'api.weixin.qq.com'"等此类问题。解决方法如下

        1、使用CMD的命令窗口Ping 第三方接口的域名获得域名的真实IP。

        2、服务器上找到指定文件夹(C:\Windows\System32\drivers\etc\ )中 hosts文件。

        3、打开hosts文件,在末尾添加上IP与域名的绑定对应关系,然后保存hosts文件即可。

        例如:119.147.6.237      api.weixin.qq.com 。

 

 

你遇到的异常: ``` System.Net.WebException: 请求被中止: 未能创建 SSL/TLS 安全通道。 ``` 这是一个在 **.NET Framework** 中非常常见的 HTTPS 请求错误,尤其是在调用内部系统(如 `https://wjmes.xcmg.com`)时。下面我们从 **根本原因、解决方案、代码示例** 到 **部署建议** 一步步详细解析。 --- ## ✅ 根本原因分析 这个错误表示:**客户端与服务器在建立 HTTPS 连接时,无法协商出一个共同支持的 SSL/TLS 协议版本**。 ### 🔍 常见原因有: | 原因 | 说明 | |------|------| | 1. ❌ 默认 TLS 版本太低 | .NET Framework 4.x 默认使用 `TLS 1.0`,而现代服务器已禁用 | | 2. 🚫 目标服务器要求 TLS 1.2+ | `wjmes.xcmg.com` 很可能只接受 `TLS 1.2` 或更高 | | 3. 🧱 客户端未启用高版本协议 | 没有显式设置 `ServicePointManager.SecurityProtocol = Tls12;` | | 4. 🛡️ 系统/操作系统不支持 TLS 1.2 | 如 Windows Server 2008 R2 需要注册表开启 | | 5. 📜 证书链不受信任 | 内网 CA 签发证书未安装到“受信任的根证书颁发机构” | > ⚠️ 错误发生在连接阶段(握手失败),所以即使 URL 正确也会报错。 --- ## ✅ 解决方案(必须组合使用) ### ✅ 第一步:强制启用 TLS 1.2(最关键!) 在程序启动时添加以下代码: ```csharp // 启用 TLS 1.2(必须) ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; // 可选:兼容多个版本(如果你不确定服务器支持哪些) // ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; ``` 📌 注意: - 必须在 **发起任何 HTTPS 请求之前执行** - 使用 `=` 赋值,不要用 `+=` - `.NET Framework 4.5+` 才支持 `Tls12` 枚举 --- ### ✅ 第二步:忽略证书验证(仅限内网可信环境) 因为企业内网服务通常使用私有 CA 或自签名证书,系统默认不信任。 ```csharp // 忽略所有证书错误(⚠️ 仅用于测试或封闭内网) ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true; ``` > 🛑 生产环境建议优先安装正确的根证书,而不是忽略验证。 --- ### ✅ 第三步:确保操作系统支持 TLS 1.2 #### 对于 Windows Server 2008 R2 / Windows 7: 需要手动启用 TLS 1.2(通过注册表或组策略)。 ✅ 检查方法(PowerShell): ```powershell Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" ``` 如果不存在,则需创建注册表项。 🔧 启用 TLS 1.2 的注册表示例: ```reg Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client] "Enabled"=dword:00000001 "DisabledByDefault"=dword:00000000 ``` 保存为 `.reg` 文件并导入。 --- ### ✅ 第四步:完整修复代码示例 ```csharp static void Main() { // ======== 🔐 安全设置:必须放在最前面 ======== ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true; // ============================================= try { var client = new RestClient( endPoint: "https://wjmes.xcmg.com/api/iot/dcc/", method: EnumHttpVerb.POST, postData: "{\"key\":\"value\"}" // 示例数据 ); string response = client.HttpRequest("eqpUploadToMove"); Console.WriteLine("响应结果:" + response); } catch (WebException ex) { using (var stream = ex.Response?.GetResponseStream()) { if (stream != null) { using (var reader = new StreamReader(stream)) { Console.WriteLine("错误响应体:" + reader.ReadToEnd()); } } else { Console.WriteLine("网络错误:" + ex.Message); } } } catch (Exception ex) { Console.WriteLine("其他异常:" + ex.Message); } Console.ReadKey(); } ``` --- ### ✅ 第五步:验证是否成功的方法 你可以先用最简代码测试连通性: ```csharp ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; ServicePointManager.ServerCertificateValidationCallback = (a, b, c, d) => true; var request = WebRequest.Create("https://wjmes.xcmg.com") as HttpWebRequest; using var response = request.GetResponse(); Console.WriteLine("连接成功!"); ``` 如果这都失败,请检查: - 网络是否可达(能否 ping / telnet 443) - 是否有防火墙拦截 - 是否 DNS 解析正常 --- ## ✅ 总结:你需要做的全部事情 | 步骤 | 操作 | |------|------| | 1 | 添加 `ServicePointManager.SecurityProtocol = Tls12;` | | 2 | 添加 `ServerCertificateValidationCallback` 回调返回 `true`(内网可用) | | 3 | 确保目标服务器地址拼接正确(避免双斜杠或缺失) | | 4 | 在 `Main()` 或 `Application_Start()` 中初始化上述设置 | | 5 | (推荐)升级到 .NET 4.7.1+ 或迁移到 .NET Core/.NET 5+ 自动支持 TLS 1.2 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值