C# 从SQL CLR调用web服务?

C# 从SQL CLR调用web服务?,c#,sql-server,web-services,stored-procedures,sqlclr,C#,Sql Server,Web Services,Stored Procedures,Sqlclr,我有一个SQL Server 2012存储过程,它返回一个表。我必须修改该SP以向返回的表中添加一个附加值。不幸的是,这种附加值来自对web服务的调用。根据我的研究,我收集到实现这一点的主要方法是在SQL中使用OLE自动化过程(sp_OA…)或SQLCLR存储过程。给定sp_OA所处的安全上下文。。。程序运行时,单个返回值是一个VARCHAR(10)注册密钥,对服务的调用很少(每小时10到20次),我猜SQLCLR方法是一种方法。此外,web服务托管在我们的内部网上,外部世界无法访问 有没有更好

我有一个SQL Server 2012存储过程,它返回一个表。我必须修改该SP以向返回的表中添加一个附加值。不幸的是,这种附加值来自对web服务的调用。根据我的研究,我收集到实现这一点的主要方法是在SQL中使用OLE自动化过程(sp_OA…)或SQLCLR存储过程。给定sp_OA所处的安全上下文。。。程序运行时,单个返回值是一个VARCHAR(10)注册密钥,对服务的调用很少(每小时10到20次),我猜SQLCLR方法是一种方法。此外,web服务托管在我们的内部网上,外部世界无法访问

有没有更好的方法来完成我所需要的?更好的意思是更高的性能、更好的安全性、更易于编码和维护

您完全可以

如果你不想这样,你可以用C#that编写一个Windows服务。根据您实现此服务的方式,对新记录的反应几乎是即时的。也请阅读

然后,您可以从C#执行服务调用,执行所需的工作并将结果存储在列中


当您需要更多信息时,例如在交换过程中获得的额外变量,您可以引入一个新表来存储这些信息,以及您感兴趣的实际结果。然后从您的问题表中加入该表。

请不要使用
sp\u OA*
OLE自动化过程。它们似乎没有被正式弃用,但SQLCLR既取代了OLE自动化过程,也取代了扩展存储过程

是的,这在SQLCLR中很容易做到。您可以找到有关使用WCF(如@CodeCaster的答案所示)或使用
HttpWebRequest
/
HttpWebResponse
(我在这个答案中有更多信息:)的示例。另外,请注意,有时还需要添加序列化程序集:

编码和维护
Web服务提供了一个很好的API,但是如果您更改了结构,您将不得不重新编译并重新部署至少部分API。假设交换的信息足够简单,我倾向于认为将其作为标准web请求处理会增加很多灵活性。您可以创建一个通用的web请求函数(scalar或TVF),该函数接收参数和URI,构造格式正确的XML请求并将其发送到URI。然后它得到响应,只返回XML。所以您需要转移一点责任,因为您现在需要解析XML响应,而不是获得一个好的对象。但是,XML在SQL Server中很容易解析,您可以在任何地方重复使用此函数。而且,如果曾经更新过远程服务,则更新存储过程以更改传递给Web服务的查询字符串和/或更改XML响应的解析是一个简单的
ALTER过程,应该易于测试。无需重新编译/重新部署SQLCLR程序集

安全性
无论您想要的web服务调用有多“纯粹”,从安全角度来看,最重要的是不要偷懒,在
上打开
可信(正如@CodeCaster答案中的链接页面所示,不幸的是,在interwebs上的大多数其他示例)。确保安全的正确方法是执行以下操作:

  • 在你的集会上签名
  • [master]
    数据库中,从程序集的DLL创建非对称密钥
  • 另外,在
    [master]
    中,使用该非对称密钥创建登录名
  • 授予新登录名
    外部访问程序集
    权限
  • 使用
    外部访问的
    权限集
    创建程序集
    ,而不是
    不安全的
有关以下方面的详细信息:

  • 一般使用SQLCLR时,请访问:
  • 使用模块签名,请访问:
  • 未在
上使用值得信赖的
,请阅读: