我跟着这些人走过了,我已经看过其他Stack Overflow帖子:https://code.msdn.microsoft.com/Calling-WCF-Service-from-a-8071ceaa
并且在运行我的存储过程时出现错误,该存储过程调用具有Web服务引用的类库,该类库应该调用Web服务:
找不到设置属性xxxx
我想从我可以从这个含糊的消息中收集到的是在Web服务客户端调用它的配置中找不到终点。
不幸的是,编写上述博客文章的人对此没有任何意见,在这个特定的消息上搜索数小时让我无处可去。
它有助于了解您所使用的SQL Server版本。但无论如何,如果您依赖于ServiceModel
库(或您需要手动加载到SQLServer中的任何其他.NET Framework库),那么这是行不通的。您可以在SQLCLR中执行Web服务调用,但只能使用Supported .NET Framework Libraries列表中的库。
为了做这些事情,我usually recommend使用普通的'ol HttpWebRequest
/ HttpWebResponse
类并手动处理XML的创建和解析(好吧,使用可用的.NET类)。它不会自动为您提供强类型对象,但保证可以在所有版本的SQL Server中使用。
此外,该帖子中建议启用TRUSTWORTHY
是一个糟糕的建议。您应该对Assembly进行签名,然后在DLL中创建master
中的Asymmetric Key,然后从该Asymmetric Key创建一个Login,最后授予该登录的EXTERNAL ACCESS ASSEMBLY
权限。完成此操作可以通过几种方式完成,具体取决于您使用的SQL Server版本(SQL Server 2017引入了新的复杂功能)以及是否使用Visual Studio / SSDT / SqlPackage`exe进行部署。我已经写了一系列关于这个主题的教程,显示了两个选项,它们都适用于所有版本的SQL Server(好吧,从2005到现在 - 这是2017年),从以下开始:
SQLCLR vs. SQL Server 2017, Part 1: “CLR strict security” – The Problem
第1部分(上面直接链接)解释了这种情况以及为什么SQL Server 2017中的新服务器范围设置存在问题,因为缺少内置支持,可以通过Microsoft提供的工具(如Visual Studio / SSDT)来处理它。第2和第3部分是实际的解决方案。
我使用了SQL Server项目dll引用的dll中的Web服务客户端对象。我试图积极主动地进行安全性并授予我的非对称密钥登录外部使用权,而不是不安全。一旦我授予登录不安全权限,它就能够正确调用Web服务。
谢谢@Solomon关于安全性的好建议。我想我会在这里发布我的经验给其他可能有问题的人。
您可以使用此演练(https://code.msdn.microsoft.com/Calling-WCF-Service-from-a-8071ceaa),但我将尝试添加本文遗漏的有关如何在项目中使用签名并在SQL中创建非对称密钥的内容。
添加任何静态方法以调用Web服务时编译此项目。
EXEC sp_configure 'clr enabled', '1'
RECONFIGURE
你可以按照这个存储库的相同样本....唯一的事情是它调用Api。但它与修改某些内容所需的概念基本相同。希望它能帮到你。
看看这个存储库https://github.com/geral2/SQL-APIConsumer。
步骤1
CREATE DATABASE TestDB; GO
第2步
USE TestDB GO sp_configure 'clr enabled',1 RECONFIGURE GO
第3步
ALTER DATABASE TESTDB SET TRUSTWORTHY ON GO
第4步
CREATE ASSEMBLY [System.Runtime.Serialization] AUTHORIZATION dbo FROM N'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Runtime.Serialization.dll' WITH PERMISSION_SET = UNSAFE--external_access GO
第5步
CREATE ASSEMBLY [Newtonsoft.Json] AUTHORIZATION dbo FROM N'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Newtonsoft.Json.dll' WITH PERMISSION_SET = UNSAFE go