【问题标题】:Call web service from SQL CLR?从 SQL CLR 调用 Web 服务?
【发布时间】:2015-12-28 19:42:53
【问题描述】:

我有一个返回表的 SQL Server 2012 存储过程。我必须修改该 SP 以向返回的表添加一个附加值。不幸的是,这种附加价值来自对网络服务的调用。根据我的研究,我收集到执行此操作的主要方法是使用 SQL 中的 OLE 自动化过程 (sp_OA...) 或 SQLCLR 存储过程。鉴于 sp_OA... 过程运行的安全上下文,单个返回值是 VARCHAR(10) 注册密钥,并且对服务的调用很少(每小时十到二十次),我猜 SQLCLR 方法是要走的路。此外,Web 服务托管在我们的 Intranet 上,外部世界无法访问。

有没有更好的方法来完成我的需要?更好意味着更高的性能、更好的安全性、更容易编码和维护

【问题讨论】:

    标签: c# sql-server web-services stored-procedures sqlclr


    【解决方案1】:

    请不要使用sp_OA* OLE 自动化程序。它们似乎没有被正式弃用,但 SQLCLR 取代了 OLE 自动化过程以及扩展存储过程。

    是的,这可以在 SQLCLR 中轻松完成。您可以找到有关使用 WCF 的示例(如 @CodeCaster 的答案所示)或使用 HttpWebRequest / HttpWebResponse (我在此答案中有更多信息:How to invoke webservice from SQL Server stored procedure)。另外,请注意,有时您还需要添加序列化程序集:Using Webservices and Xml Serialization in CLR Integration

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

    安全性
    无论您想要多么“纯粹”的 Web 服务调用,主要的安全方面的事情是 懒惰并转向 TRUSTWORTHY ON(如 @CodeCaster 答案中的链接页面所示) ,不幸的是互联网上的大多数其他示例)。确保安全的正确方法是执行以下操作:

    • 签署您的程序集
    • [master] 数据库中,从您的程序集的 DLL 创建一个非对称密钥。
    • 另外,在 [master] 中,使用该非对称密钥创建登录
    • 授予您的新登录 EXTERNAL ACCESS ASSEMBLY 权限
    • 使用PERMISSION_SETEXTERNAL_ACCESS 创建您的程序集,不是 UNSAFE

    更多详情:

    【讨论】:

      【解决方案2】:

      你绝对可以call a WCF service using SQL CLR

      如果您不想这样,您可以用 C# 编写一个 Windows 服务 watches or polls the table for changes。根据您实施此服务的方式,对新记录的反应几乎是立即的。另请阅读How to notify a windows service(c#) of a DB Table Change(sql 2005)?

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-13
        相关资源
        最近更新 更多