问题描述
我遇到了必须向外部服务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