2

我遇到了必须对外部服务 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 在外面拨打电话的能力,但我不知道如何解决这个问题。

有任何想法吗?

4

3 回答 3

2

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

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

更多信息在这里:

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

于 2020-11-06T22:46:51.173 回答
0

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

于 2020-11-02T19:05:51.730 回答
0

我的建议:不要这样做,你总是会遇到麻烦。

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

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

就像这样,它将顺利完成所有更新。唯一的问题是它不是立即而是稍微延迟。很大的优势:如果服务关闭,您仍然可以添加/修改记录,稍后将对其进行验证。

于 2020-11-02T19:01:37.620 回答