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 方法可完美解决此问题。

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

相关推荐
汤愈韬9 分钟前
关于OSPF中一类、二类、三类LSA的一些思考
网络·网络协议
CappuccinoRose20 分钟前
Rust学习文档(二)
开发语言·后端·学习·rust
草莓熊Lotso20 分钟前
【LangChain】核心组件详解:文档加载器(Document Loaders)
开发语言·c++·python·langchain·软件工程
kingwebo'sZone25 分钟前
C#事件声明办法
java·前端·c#
柒号华仔40 分钟前
一文讲透5G RedCap
网络协议·5g·信息与通信
Flandern11111 小时前
HTTPS(TLS 1.3)完整流程
数据库·网络协议·计算机网络·https
你怎么知道我是队长1 小时前
JavaScript的自适应效果
开发语言·javascript·ecmascript
mayaairi2 小时前
JS数组完全指南(含十大操作详解)
开发语言·前端·javascript
j7~2 小时前
【数据结构初阶】队列的实现(链式队列 + 循环队列)--详解
c语言·开发语言·数据结构·学习·队列·queue·c\c++
king_linlin2 小时前
算法基础——算法复杂度
c语言·开发语言·数据结构·算法