调用API的SQL Server程序集

问题描述

我遇到了必须向外部服务SmartyStreets进行API调用的SQL Server程序集的问题。 我创建了一个引用SmartyStreets DLL的DLL。 这个新的DLL将使用地址字段,调用API并返回varchar(max)。

在VS中进行测试时,我为输入地址创建了一个基本形式,它将调用DLL,然后使用结果填充文本框。我的新DLL有效。

我为SmartySteets DLL创建了程序集,其设置如下:

CREATE ASSEMBLY SmartyStreets from 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\smartystreets-dotnet-sdk.dll' WITH PERMISSION_SET = UNSAFE;

我为DLL(引用SmartyStreets DLL)创建了程序集,如下所示:

CREATE ASSEMBLY SmartyStreets_API from 'C:\Program Files\Microsoft SQL Server\MSSQL14.HMARK\MSSQL\Binn\SmartyStreetsDLL.dll' WITH PERMISSION_SET = UNSAFE;

该函数已创建:

CREATE function CLR_AddressStandardization ( 
              @sAddress1 nvarchar(max),@sAddress2 nvarchar(max),@sCity nvarchar(max),@sState nvarchar(max),@sZIP nvarchar(max),@sCountry nvarchar(max)) returns nvarchar(max) 
EXTERNAL NAME SmartyStreets_API.[SmartyStreetsDLL.SSDLL].StandardizeAddress

现在我调用新函数: select dbo.CLR_AddressStandardization('18600 Malyn','','Fraser','MI','48026','') 并返回“错误:请求已中止:无法创建SSL / TLS安全通道。”

我认为是某些因素阻止了SmartyStreets DLL进行外部呼叫的功能,但我不知道该如何解决。

有什么想法吗?

解决方法

我的建议:别这样,您总是会遇到麻烦。

即使您立即运行它,您也要在每次Windows更新中祈祷它仍在工作,并且您将不得不花费很多时间重新安装(未更改的)程序集,因为某些.NET Framework程序集已更改并且SQL Server检测到一个不一致,并拒绝处理呼叫。

写一个设置“ IsDirty”标志的触发器,在其上放一个局部索引(WHERE IsDirty = 1),然后编写一个服务来检查是否有脏记录并调用REST服务(或其他)。这些记录。

就像它将在所有更新中正常工作一样。唯一的问题是它不是立即而是稍微延迟。最大优势:如果服务中断,您仍然可以添加/修改记录,这些记录将在以后进行验证。

,

想到的第一种可能性是Web服务的另一端需要SSL通道,但是您的客户端呼叫未提供客户端证书-或您所提供的客户端证书不受信任。您可能必须配置出站呼叫以提供证书,考虑到解决方案的体系结构,这可能会有些困难。您的程序集可以以编程方式提供一个。

,

这是一个加密握手问题。几乎每次我看到此消息时,都意味着对我们的API进行https调用的应用程序/进程/操作系统正在尝试使用早于TLS 1.2的TLS版本。 SmartyStreets不接受那些旧版本。

有时只需要更新操作系统或.Net的版本

更多信息在这里:

https://smartystreets.com/blog/2019/10/removing-old-versions-of-tls

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...