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

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

相关推荐
せいしゅん青春之我13 分钟前
[JavaEE初阶]网络协议-状态码
java·网络协议·http
东巴图27 分钟前
分解如何利用c++修复小程序的BUG
开发语言·c++·bug
祁同伟.28 分钟前
【C++】二叉搜索树(图码详解)
开发语言·数据结构·c++·容器·stl
恒者走天下28 分钟前
AI智能网络检测项目(cpp c++项目)更新
开发语言·c++
shayudiandian1 小时前
JavaScript性能优化实战
开发语言·javascript·性能优化
老K的Java兵器库1 小时前
集合性能基准测试报告:ArrayList vs LinkedList、HashMap vs TreeMap、并发 Map 四兄弟
java·开发语言
枫叶丹41 小时前
【Qt开发】多元素类控件(二)-> QTableWidget
开发语言·qt
bin91531 小时前
当AI开始‘映射‘用户数据:初级Python开发者的创意‘高阶函数‘如何避免被‘化简‘?—— 老码农的函数式幽默
开发语言·人工智能·python·工具·ai工具
小蝈蝈啊1 小时前
HTTP相关知识点
网络协议·http·iphone