C# 解决访问 API 显示基础连接已经关闭的问题

目录

故障现象

开发运行环境

解决

其它


故障现象

最近在 Web 部署百度 AI 图像识别 AipSdk.dll 封装库的时候,在调用OCR图像识别 API 的时候,显示为 " 基础连接已经关闭: 接收时发生错误。" ,并且运行后直接崩溃:

以身份证识别为例,如下代码:

cs 复制代码
var API_KEY = "";
var SECRET_KEY = "";
                        
var client = new Baidu.Aip.Ocr.Ocr(API_KEY, SECRET_KEY);

client.Timeout = 60000;  // 修改超时时间
                        
Newtonsoft.Json.Linq.JObject result = new Newtonsoft.Json.Linq.JObject();
var options = new Dictionary<string, object>{
   {"detect_risk", "true"},
   {"detect_direction", "true"},
   {"detect_photo", "true"}
};
byte[] image = getImageByte(imagePath);
result = client.Idcard(image, "front", options);

问题出在 client.Idcard(image, "front", options); 调用上,这种现象不是每次都会发生,在其它部署的 IIS 站点上未发现此类问题,且部署配置一致。

开发运行环境

操作系统: Windows Server 2019 DataCenter

.net版本: .netFramework4.7.2

开发工具:VS2019 C#

解决

通过在Page_Load 服务器事件添加如下语句,解决:

cs 复制代码
void Page_Load(Object sender, EventArgs e)
{
     System.Net.ServicePointManager.SecurityProtocol = 
System.Net.SecurityProtocolType.Tls | 
System.Net.SecurityProtocolType.Tls11 | 
System.Net.SecurityProtocolType.Tls12;

}  

System.Net.ServicePointManager.SecurityProtocol 属性可选择安全套接字层 (SSL) 或传输层安全 (TLS) 协议的版本,以用于新连接,不会更改现有连接。

System.Net.SecurityProtocolType 指定 Schannel 安全包支持的安全协议的可选择项见下表:

| 序号 | 值 | 说明 |
| 1 | Ssl3 | 指定安全套接字层 (SSL) 3.0 安全协议。 SSL 3.0 已由传输层安全性 (TLS) 协议取代,之所以仍然提供这个方法,只是为了向后兼容。 |
| 2 | SystemDefault | 允许操作系统选择要使用的最佳协议,并将其用于阻止不安全的协议。 应使用此值,除非应用有特定原因不得使用此值。 |
| 3 | Tls | 指定传输层安全 (TLS) 1.0 安全协议。 TLS 1.0 协议在 IETF RFC 2246 中定义。 |
| 4 | Tls1 | 指定传输层安全 (TLS) 1.1 安全协议。 TLS 1.1 协议在 IETF RFC 4346 中定义。 在 Windows 系统上,从 Windows 7 开始支持此值。 |

5 Tls2 指定传输层安全 (TLS) 1.2 安全协议。 TLS 1.2 协议在 IETF RFC 5246 中定义。 在 Windows 系统上,从 Windows 7 开始支持此值。

更多详情请参考:

https://learn.microsoft.com/zh-cn/dotnet/api/system.net.servicepointmanager.securityprotocol?view=netcore-2.0

其它

解决该问题是由于百度封装的库,则需要在Page_Load事件进行外围处理即可,在运行中为保险起见还是要对调用进行异常处理。现其已经开源,有C#版本,详情可访问如下网址:

https://ai.baidu.com/ai-doc/IMAGERECOGNITION/2k3bcxhqb

如果对于可直接访问的 API URL ,可参阅我的文章:

《C# 关于"您与该网站的连接不是私密连接..."的问题》

《C# 实现访问 Web API Url 提交数据并获取处理结果》

通过 GetResponseResult 方法可完美解决此问题。

感谢您的阅读,希望本文能够对您有所帮助。

相关推荐
小灰灰搞电子5 分钟前
PyQt QtWaitingSpinner详解-为你的 Qt 程序带来丝滑等待动画
开发语言·qt·pyqt
Gofarlic_oms15 分钟前
Adams许可排队严重?不想买新许可,闲置回收立即可用
java·大数据·服务器·开发语言·人工智能
张小凡vip7 分钟前
python单元测试详解
开发语言·python·单元测试
爱喝水的鱼丶9 分钟前
SAP-ABAP:SAP 系统变量 SY-INDEX 学习笔记:从 1 开始的循环计数器
运维·开发语言·数据库·sap·abap
史迪仔01129 分钟前
[QML] Qt6/Qt5四大渐变效果实战指南
开发语言·前端·c++·qt
平凡但不平庸的码农16 分钟前
Go 语言基础语法
开发语言·后端·golang
meng_ser20 分钟前
[NewStarCTF 2023 公开赛道]eazy_crt
开发语言·python
X7x521 分钟前
广域网技术全解:从 CE/PE/P 设备到 PPP/PPPoE 协议与三厂商配置实战
网络·网络协议·信息与通信·广域网技术
小短腿的代码世界23 分钟前
QCefView深度解析:在Qt中嵌入Chromium的架构设计与性能优化实战
开发语言·qt·性能优化