使用 SQL CLR 调用 Web 服务
Using SQL CLR to Call a Web Service
我按照这些人的演练进行了操作,我在其他 Stack Overflow post 中看到过 post:https://code.msdn.microsoft.com/Calling-WCF-Service-from-a-8071ceaa
当我的存储过程 运行 调用 class 库时出现错误,该库具有应该调用 Web 服务的 Web 服务引用:
The settings property xxxx was not found
我认为从这条模糊的消息中我可以收集到的信息是,在 Web 服务客户端调用它的配置中找不到端点。
不幸的是,写上述博客的人 post 对此一无所知,并且在这条特定消息上搜索了几个小时也让我一无所获。
了解您所使用的 SQL 服务器的版本会有所帮助。但无论如何,如果您依赖 ServiceModel
库(或您需要手动加载到 SQLServer 的任何其他 .NET Framework 库),那么这是行不通的。您可以在 SQLCLR 中执行 Web 服务调用,但只能使用 Supported .NET Framework Libraries 列表中的库。
为了做这样的事情,我 usually recommend 使用普通的 'ol HttpWebRequest
/ HttpWebResponse
类 并处理 XML 的创建和解析手动(嗯,使用可用的 .NET 类)。它不会自动给你一个强类型的对象,但它保证在所有版本的 SQL 服务器上工作。
此外,post 中启用 TRUSTWORTHY
的建议是错误的建议。您应该改为签署程序集,然后从 DLL 在 master
中创建一个非对称密钥,然后从该非对称密钥创建一个登录名,最后授予该登录名的 EXTERNAL ACCESS ASSEMBLY
权限。可以通过几种方式完成此操作,具体取决于您使用的 SQL 服务器版本(SQL Server 2017 引入了新的复杂功能)以及您是否使用 Visual Studio / SSDT / SqlPackage`exe 用于部署。我写了一系列关于这个主题的教程,展示了 2 个选项,它们都适用于 SQL 服务器的所有版本(好吧,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 服务器项目 dll 引用的 dll 中的 Web 服务客户端对象使它正常工作。我试图在安全方面积极主动,并授予我的非对称密钥登录外部使用权限,而不是不安全的。一旦我授予登录不安全权限,它就能够正确调用 Web 服务。
感谢@Solomon 提供的安全提示。我想我会 post 我的经验,供其他可能遇到问题的人使用。
您可以使用此演练 (https://code.msdn.microsoft.com/Calling-WCF-Service-from-a-8071ceaa),但我会尝试添加本文遗漏的有关如何在您的项目中使用签名并在其中创建非对称密钥的内容 SQL.
- 创建一个 Visual Studio 类型库的项目并添加对 WCF 服务的 Web 引用。然后创建一个方法(确保它是静态的)来创建您的 Web 服务客户端对象并调用您的服务。
在您添加了用于调用 Web 服务的任何静态方法后编译此项目。
创建一个Visual Studio类型为SQL服务器数据库项目的项目,并添加对之前库项目的dll的引用。使用上面的 link 查看如何设置此项目。
(注意当我在本地进行引用然后将内容移动到服务器时,我确保我的 SQL 服务器数据库项目具有库项目的 dll 引用的这些属性,Copy Local = true,Specific Version = false,Generate SQL Script = false, Is Visible = true, Model Aware = true, and permission set = external(不确定这最后一个是否重要,因为无论如何我都必须授予对我的 sql 登录的不安全访问权限.. .)
我使用 windows SDK 中的 sn.exe 工具来创建我的 .snk 文件,它在 sql 中用于创建您的登录,它是也用来签下之前的2个VS项目。 (或者,如果您已经了解如何创建签名程序集,请直接通过 Visual Studio 进行操作,然后在 SQL 服务器中使用该 .snk)
我用这个linkhttps://www.codeproject.com/Articles/290249/Deploy-Use-assemblies-which-require-Unsafe-Externa(方法2)来学习如何使用sn.exe工具以及如何设置非对称密钥和登录在 SQL 服务器中使用。注意(sn.exe 工具的位置对我来说与本文中的位置不同,对我来说我必须转到位置:c:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 工具也可能因其他人而异。
您必须做的最后一件事是重新配置您的数据库服务器以允许 CLR,这是在 SQL 服务器中使用以下命令完成的:
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:\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
我按照这些人的演练进行了操作,我在其他 Stack Overflow post 中看到过 post:https://code.msdn.microsoft.com/Calling-WCF-Service-from-a-8071ceaa
当我的存储过程 运行 调用 class 库时出现错误,该库具有应该调用 Web 服务的 Web 服务引用:
The settings property xxxx was not found
我认为从这条模糊的消息中我可以收集到的信息是,在 Web 服务客户端调用它的配置中找不到端点。
不幸的是,写上述博客的人 post 对此一无所知,并且在这条特定消息上搜索了几个小时也让我一无所获。
了解您所使用的 SQL 服务器的版本会有所帮助。但无论如何,如果您依赖 ServiceModel
库(或您需要手动加载到 SQLServer 的任何其他 .NET Framework 库),那么这是行不通的。您可以在 SQLCLR 中执行 Web 服务调用,但只能使用 Supported .NET Framework Libraries 列表中的库。
为了做这样的事情,我 usually recommend 使用普通的 'ol HttpWebRequest
/ HttpWebResponse
类 并处理 XML 的创建和解析手动(嗯,使用可用的 .NET 类)。它不会自动给你一个强类型的对象,但它保证在所有版本的 SQL 服务器上工作。
此外,post 中启用 TRUSTWORTHY
的建议是错误的建议。您应该改为签署程序集,然后从 DLL 在 master
中创建一个非对称密钥,然后从该非对称密钥创建一个登录名,最后授予该登录名的 EXTERNAL ACCESS ASSEMBLY
权限。可以通过几种方式完成此操作,具体取决于您使用的 SQL 服务器版本(SQL Server 2017 引入了新的复杂功能)以及您是否使用 Visual Studio / SSDT / SqlPackage`exe 用于部署。我写了一系列关于这个主题的教程,展示了 2 个选项,它们都适用于 SQL 服务器的所有版本(好吧,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 服务器项目 dll 引用的 dll 中的 Web 服务客户端对象使它正常工作。我试图在安全方面积极主动,并授予我的非对称密钥登录外部使用权限,而不是不安全的。一旦我授予登录不安全权限,它就能够正确调用 Web 服务。
感谢@Solomon 提供的安全提示。我想我会 post 我的经验,供其他可能遇到问题的人使用。
您可以使用此演练 (https://code.msdn.microsoft.com/Calling-WCF-Service-from-a-8071ceaa),但我会尝试添加本文遗漏的有关如何在您的项目中使用签名并在其中创建非对称密钥的内容 SQL.
- 创建一个 Visual Studio 类型库的项目并添加对 WCF 服务的 Web 引用。然后创建一个方法(确保它是静态的)来创建您的 Web 服务客户端对象并调用您的服务。
在您添加了用于调用 Web 服务的任何静态方法后编译此项目。
创建一个Visual Studio类型为SQL服务器数据库项目的项目,并添加对之前库项目的dll的引用。使用上面的 link 查看如何设置此项目。 (注意当我在本地进行引用然后将内容移动到服务器时,我确保我的 SQL 服务器数据库项目具有库项目的 dll 引用的这些属性,Copy Local = true,Specific Version = false,Generate SQL Script = false, Is Visible = true, Model Aware = true, and permission set = external(不确定这最后一个是否重要,因为无论如何我都必须授予对我的 sql 登录的不安全访问权限.. .)
我使用 windows SDK 中的 sn.exe 工具来创建我的 .snk 文件,它在 sql 中用于创建您的登录,它是也用来签下之前的2个VS项目。 (或者,如果您已经了解如何创建签名程序集,请直接通过 Visual Studio 进行操作,然后在 SQL 服务器中使用该 .snk)
我用这个linkhttps://www.codeproject.com/Articles/290249/Deploy-Use-assemblies-which-require-Unsafe-Externa(方法2)来学习如何使用sn.exe工具以及如何设置非对称密钥和登录在 SQL 服务器中使用。注意(sn.exe 工具的位置对我来说与本文中的位置不同,对我来说我必须转到位置:c:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 工具也可能因其他人而异。
您必须做的最后一件事是重新配置您的数据库服务器以允许 CLR,这是在 SQL 服务器中使用以下命令完成的:
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:\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