C# 从SQL CLR调用web服务?
我有一个SQL Server 2012存储过程,它返回一个表。我必须修改该SP以向返回的表中添加一个附加值。不幸的是,这种附加值来自对web服务的调用。根据我的研究,我收集到实现这一点的主要方法是在SQL中使用OLE自动化过程(sp_OA…)或SQLCLR存储过程。给定sp_OA所处的安全上下文。。。程序运行时,单个返回值是一个VARCHAR(10)注册密钥,对服务的调用很少(每小时10到20次),我猜SQLCLR方法是一种方法。此外,web服务托管在我们的内部网上,外部世界无法访问 有没有更好的方法来完成我所需要的?更好的意思是更高的性能、更好的安全性、更易于编码和维护您完全可以 如果你不想这样,你可以用C#that编写一个Windows服务。根据您实现此服务的方式,对新记录的反应几乎是即时的。也请阅读 然后,您可以从C#执行服务调用,执行所需的工作并将结果存储在列中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服务托管在我们的内部网上,外部世界无法访问 有没有更好
当您需要更多信息时,例如在交换过程中获得的额外变量,您可以引入一个新表来存储这些信息,以及您感兴趣的实际结果。然后从您的问题表中加入该表。请不要使用
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时,请访问:
- 使用模块签名,请访问:
- 未在
上使用值得信赖的,请阅读: