C# Windows Forms调用第三方短信API报错:基础连接已关闭,接收时发生意外错误
解决方案
1. 优先修复TLS协议版本不匹配问题
该错误90%以上的场景是因为程序默认使用的TLS版本低于第三方API要求的最低版本(当前绝大多数公开HTTPS接口要求TLS 1.2及以上)。
在创建HttpWebRequest实例前添加如下代码指定协议版本:
// 适配多版本TLS,优先使用高版本 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
如果你使用的是.NET Framework 4.0及更低版本,没有Tls12枚举,用如下代码代替:
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072 /*TLS1.2*/ | (SecurityProtocolType)768 /*TLS1.1*/ | (SecurityProtocolType)192 /*TLS1.0*/;
如果是.NET Framework 4.7及以上版本,可以直接在App.config中添加配置无需硬编码:
<runtime> <AppContextSwitchOverrides value="Switch.System.Net.DontEnableSystemDefaultTlsVersions=false"/> </runtime>
2. 补充请求参数校验与异常捕获
- 确认代码中
authKey字段已填入你在msg91平台申请的有效鉴权密钥,空鉴权信息会触发服务端主动断开连接 - 建议给
HttpWebRequest添加超时、关闭长连接配置,避免连接被服务端主动回收时报错:
httpWReq.Timeout = 10000; // 10秒超时 httpWReq.KeepAlive = false;
- 新增WebException捕获逻辑,获取服务端返回的具体错误信息:
try { HttpWebResponse response = (HttpWebResponse)httpWReq.GetResponse(); // 原有响应处理逻辑 } catch (WebException ex) { string errorMsg = string.Empty; if (ex.Response != null) { using (StreamReader sr = new StreamReader(ex.Response.GetResponseStream())) { errorMsg = sr.ReadToEnd(); } } // 输出errorMsg即可查看服务端返回的具体错误原因 }
3. 前置接口可用性校验
先使用Postman、Apifox等接口调试工具,填入相同的请求参数调用https://control.msg91.com/api/sendhttp.php接口:
- 如果调试工具也调用失败:检查参数正确性、本地网络是否能访问目标域名、是否有防火墙/代理拦截请求
- 如果调试工具调用成功:回到代码侧对比参数编码、请求头配置是否和调试工具一致
4. 资源释放优化
原有代码中的响应对象建议用using块自动释放,避免连接资源泄漏导致后续请求报错:
using (HttpWebResponse response = (HttpWebResponse)httpWReq.GetResponse()) { using (StreamReader reader = new StreamReader(response.GetResponseStream())) { string responseString = reader.ReadToEnd(); return responseString; } }
内容的提问来源于stack exchange,提问作者ashok
相关产品推荐
相关产品推荐

