目录
故障现象
开发运行环境
解决
其它
故障现象
最近在 Web 部署百度 AI 图像识别 AipSdk.dll 封装库的时候,在调用OCR图像识别 API 的时候,显示为 “ 基础连接已经关闭: 接收时发生错误。” ,并且运行后直接崩溃:
以身份证识别为例,如下代码:
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 服务器事件添加如下语句,解决:
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 方法可完美解决此问题。
感谢您的阅读,希望本文能够对您有所帮助。