使用SQL CLR调用Web服务

问题描述 投票:1回答:3

我跟着这些人走过了,我已经看过其他Stack Overflow帖子:https://code.msdn.microsoft.com/Calling-WCF-Service-from-a-8071ceaa

并且在运行我的存储过程时出现错误,该存储过程调用具有Web服务引用的类库,该类库应该调用Web服务:

找不到设置属性xxxx

我想从我可以从这个含糊的消息中收集到的是在Web服务客户端调用它的配置中找不到终点。

不幸的是,编写上述博客文章的人对此没有任何意见,在这个特定的消息上搜索数小时让我无处可去。

c# sql-server web-services wcf sqlclr
3个回答
1
投票

它有助于了解您所使用的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部分是实际的解决方案。


0
投票

我使用了SQL Server项目dll引用的dll中的Web服务客户端对象。我试图积极主动地进行安全性并授予我的非对称密钥登录外部使用权,而不是不安全。一旦我授予登录不安全权限,它就能够正确调用Web服务。

谢谢@Solomon关于安全性的好建议。我想我会在这里发布我的经验给其他可能有问题的人。

您可以使用此演练(https://code.msdn.microsoft.com/Calling-WCF-Service-from-a-8071ceaa),但我将尝试添加本文遗漏的有关如何在项目中使用签名并在SQL中创建非对称密钥的内容。

  1. 创建类型库的Visual Studio项目,并向WCF服务添加Web引用。然后创建一个方法(确保它是静态的),它创建您的Web服务客户端对象并调用您的服务。

添加任何静态方法以调用Web服务时编译此项目。

  1. 创建SQL Server数据库项目类型的Visual Studio项目,并添加对先前库项目的dll的引用。使用上面的链接查看如何设置此项目。 (注意当我在本地进行引用然后将内容移动到服务器时,我确保我的SQL Server数据库项目具有Library项目的dll引用的这些属性,Copy Local = true,Specific Version = false,Generate SQL Script = false ,是Visible = true,Model Aware = true,权限set = external(不确定这最后一个是否重要,因为我不得不授予对我的sql登录的不安全访问权限......)
  2. 我使用windows SDK中的sn.exe工具创建我的.snk文件,这在sql中用于创建登录,它也用于签署前2个VS项目。 (或者,如果您已经在创建已签名的程序集,请直接通过Visual Studio,然后在SQL Server中使用该.snk)
  3. 我使用此链接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工具也可能因其他人而异。
  4. 您需要做的最后一件事是重新配置数据库服务器以允许CLR,这在SQL Server中使用以下命令完成: EXEC sp_configure 'clr enabled', '1' RECONFIGURE
  5. 至于启用clr,我不确定这是你应该在你的存储过程中打开的东西,然后再关闭,(安全想法有人吗?)。

0
投票

你可以按照这个存储库的相同样本....唯一的事情是它调用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
© www.soinside.com 2019 - 2024. All rights reserved.