Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用SQLCLR调用Web服务_C#_Sql Server_Web Services_Wcf_Sqlclr - Fatal编程技术网

C# 使用SQLCLR调用Web服务

C# 使用SQLCLR调用Web服务,c#,sql-server,web-services,wcf,sqlclr,C#,Sql Server,Web Services,Wcf,Sqlclr,我跟着这些家伙走了一遍,我在其他堆栈溢出帖子中看到过: 我在运行存储过程时遇到一个错误,该存储过程调用了类库,该类库具有web服务引用,该引用应该调用web服务: 找不到设置属性xxxx 我想从这个模糊的消息中可以得到的是,在配置中找不到端点,web服务客户端无法调用它 不幸的是,写上述博客文章的人对此一无所知,在这条特定消息上搜索数小时,我一无所获。了解您使用的SQL Server版本会有所帮助。但是不管怎样,如果您依赖于ServiceModel库(或者需要手动加载到SQLServer中的任何

我跟着这些家伙走了一遍,我在其他堆栈溢出帖子中看到过:

我在运行存储过程时遇到一个错误,该存储过程调用了类库,该类库具有web服务引用,该引用应该调用web服务:

找不到设置属性xxxx

我想从这个模糊的消息中可以得到的是,在配置中找不到端点,web服务客户端无法调用它


不幸的是,写上述博客文章的人对此一无所知,在这条特定消息上搜索数小时,我一无所获。

了解您使用的SQL Server版本会有所帮助。但是不管怎样,如果您依赖于
ServiceModel
库(或者需要手动加载到SQLServer中的任何其他.NET Framework库),那么这是行不通的。您可以在SQLCLR中进行web服务调用,但只能使用列表中的库

为了做这些事情,我使用普通的'ol
HttpWebRequest
/
HttpWebResponse
类,并手动处理XML的创建和解析(当然,使用可用的.NET类)。它不会自动为您提供强类型对象,但它保证可以跨所有版本的SQL Server工作

此外,那篇文章中关于启用可信的建议是错误的。您应该对程序集进行签名,然后从DLL在
master
中创建一个非对称密钥,然后从该非对称密钥创建一个登录名,最后授予
外部访问程序集对该登录名的权限。实现这一点可以通过几种方式完成,具体取决于您使用的SQL Server版本(SQL Server 2017引入了一个新的复杂性),以及您是否使用Visual Studio/SSDT/SqlPackage`exe进行部署。我已经就此主题编写了一系列教程,其中显示了两个选项,这两个选项都适用于所有版本的SQL Server(从2005年到当前,目前是2017年),首先是:


第1部分(直接链接到上面)解释了这种情况,以及为什么SQL server 2017中的新服务器范围设置是一个问题,因为缺乏通过Microsoft提供的工具(如Visual Studio/SSDT)处理它的内置支持。第2部分和第3部分是实际的解决方案。

我使用SQL Server项目dll引用的dll中的web服务客户端对象实现了这一点。我试图在安全方面采取主动,并授予我的非对称密钥登录外部使用权,而不是不安全的。一旦我授予登录权限,它就能够正确地调用web服务

感谢@Solomon提供的关于安全性的好提示。我想我会把我的经验发布在这里,给任何可能有问题的人

您可以使用此演练(),但我将尝试添加本文遗漏的关于如何在项目中使用签名以及如何在SQL中创建非对称密钥的内容

  • 创建类型为Library的Visual Studio项目,并向WCF服务添加web引用。然后创建一个方法(确保它是静态的),用于创建web服务客户机对象并调用服务
  • 当您添加了用于调用web服务的任何静态方法时,请编译此项目

  • 创建SQL Server数据库项目类型的Visual Studio项目,并添加对上一个库项目的dll的引用。使用上面的链接查看如何设置此项目。 (注意,当我在本地进行引用,然后将内容移动到服务器时,我确保我的SQL server数据库项目具有以下库项目的dll引用属性:Copy Local=true、Specific Version=false、Generate SQL Script=false、Is Visible=true、Model Aware=true和permission set=external(不确定最后一个是否重要,因为我必须授予对sql登录的不安全访问权…)

  • 我使用windows SDK中的sn.exe工具创建了我的.snk文件,该文件在sql中用于创建您的登录名,还用于对以前的2个VS项目进行签名。(或者,如果您已经了解如何创建已签名程序集,请直接通过Visual Studio进行创建,然后在sql Server中使用该.snk)

  • 我使用此链接(方法2)学习如何使用sn.exe工具,以及如何设置非对称密钥和登录以在SQL Server中使用。注意(sn.exe工具的位置与本文中的位置不同,我必须转到位置:c:\Program Files(x86)\Microsoft SDK\Windows\v8.1A\bin\NETFX 4.5.1工具其他工具也可能有所不同

  • 最后要做的事情之一是重新配置数据库服务器以允许CLR,这在SQL server中通过以下命令完成:

    EXEC sp_configure 'clr enabled', '1'
    RECONFIGURE
    
  • 至于启用clr,我不确定您是否应该在存储过程中打开它,然后再关闭它(有人知道吗?)


  • 您可以使用这个存储库的相同示例…唯一的问题是它正在调用一个Api。但它基本上与您需要修改某些内容的概念相同。 希望对你有帮助

    请查看此存储库

    第一步

    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
    

    您是否验证了.config文件中是否包含该设置?是否将编译后的dll移动到某个位置,而不是将其与.config文件一起复制?感谢两位的快速回复,只是为了澄清一下,我正在使用Visual Studio 2013、SQL Server 2014。我验证了配置文件中是否包含该设置,以及何时将编译后的dll移动到服务器上sting SQL Server我也移动了配置。@Solomon,我没有按照帖子的指示打开Trustly,我找到了一些MSDN文档,说明了如何按照您的建议执行操作,并做了这些事情以尽可能地保持安全性。看起来我可能不得不使用HttpWebRequest来完成,因为我在