我遵循了这个家伙的演练,我已经在其他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 服务调用,但只能使用"支持的 .NET 框架库"列表中的库。
对于这些事情,我通常建议使用普通的 'olHttpWebRequest
/HttpWebResponse
类并手动处理 XML 的创建和解析(好吧,使用可用的 .NET 类)。它不会自动为您提供强类型对象,但可以保证在所有版本的 SQL Server 上工作。
此外,该帖子中启用TRUSTWORTHY
的建议是糟糕的建议。相反,您应该对程序集进行签名,然后从 DLL 创建master
中的非对称密钥,然后从该非对称密钥创建登录名,最后授予对该登录名的EXTERNAL ACCESS ASSEMBLY
权限。可以通过几种方式完成此操作,具体取决于您使用的SQL Server版本(SQL Server 2017引入了新的复杂性)以及是否使用Visual Studio/SSDT/SqlPackage'exe进行部署。我写了一系列关于这个主题的教程,展示了 2 个选项,它们都适用于所有版本的 SQL Server(嗯,2005 年到当前 - 目前是 2017 年),从:
SQLCLR vs.SQL Server 2017,第 1 部分:"CLR 严格安全性" – 问题
第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 中创建非对称密钥的部分。
- 创建类型为"库"的 Visual Studio 项目,并添加对 WCF 服务的 Web 引用。然后创建一个方法(确保它是静态的),该方法创建 Web 服务客户端对象并调用您的服务。
添加任何用于调用 Web 服务的静态方法时,编译此项目。
-
创建 SQL Server 数据库项目的 Visual Studio 项目,并添加对上一个库项目的 dll 的引用。使用上面的链接查看如何设置此项目。 (注意:当我在本地进行引用然后将内容移动到服务器时,我确保我的 SQL Server 数据库项目具有库项目的 dll 引用的这些属性,复制本地 = true,特定版本 = false,生成 SQL 脚本 = false,可见 = 真,模型感知 = 真,权限集 = 外部(不确定最后一个是否重要,因为我无论如何都必须授予对我的 sql 登录的不安全访问权限......
-
我使用 windows SDK 中的 sn.exe 工具创建了我的 .snk 文件,这在 sql 中用于创建您的登录名,也用于对之前的 2 个 VS 项目进行签名。(或者,如果您已经在创建已签名的程序集,请直接通过Visual Studio执行此操作,然后在SQL Server中使用该.snk)
-
我使用此链接 https://www.codeproject.com/Articles/290249/Deploy-Use-assemblies-which-require-Unsafe-Externa(方法 2)了解如何使用 sn.exe 工具以及如何设置非对称密钥和登录以在 SQL Server 中使用。注意(sn.exe工具的位置对我来说与本文中的位置不同,对我来说,我必须转到位置:c:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 工具 这可能也因其他人而异。
-
您需要做的最后一件事是重新配置数据库服务器以允许 CLR,这是在 SQL Server 中使用以下命令完成的:
EXEC sp_configure 'clr enabled', '1' RECONFIGURE
-
至于启用clr,我不确定这是否是您应该在存储过程中打开然后再次关闭的东西,(安全想法有人吗?
你可以按照这个存储库的相同示例进行操作。唯一的问题是它调用了一个 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:WindowsMicrosoft.NETFramework64v4.0.30319System.Runtime.Serialization.dll' WITH PERMISSION_SET = UNSAFE--external_access GO
步骤 5
CREATE ASSEMBLY [Newtonsoft.Json] AUTHORIZATION dbo FROM N'C:WindowsMicrosoft.NETFramework64v4.0.30319Newtonsoft.Json.dll' WITH PERMISSION_SET = UNSAFE go